{"library":"schedulefree","title":"Schedule-Free Optimization in PyTorch","description":"Schedule-Free is a PyTorch library that provides optimizers designed for 'schedule-free' learning, eliminating the need for traditional learning rate schedules. It aims to achieve faster training times without requiring users to specify the stopping time or steps in advance. The library, currently at version 1.4.1, offers variants of popular optimizers like SGD, AdamW, and RAdam, and is actively maintained by Facebook Research.","language":"python","status":"active","last_verified":"Tue May 12","install":{"commands":["pip install schedulefree"],"cli":null},"imports":["from schedulefree import SGDScheduleFree","from schedulefree import AdamWScheduleFree","from schedulefree import RAdamScheduleFree","from schedulefree import ScheduleFreeWrapper"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import torch\nimport torch.nn as nn\nfrom schedulefree import AdamWScheduleFree\n\n# 1. Define a simple model\nclass SimpleModel(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.linear = nn.Linear(10, 1)\n\n    def forward(self, x):\n        return self.linear(x)\n\nmodel = SimpleModel()\n\n# 2. Define a Schedule-Free optimizer (e.g., AdamWScheduleFree)\n# Note: Schedule-Free optimizers often benefit from higher learning rates than traditional ones.\noptimizer = AdamWScheduleFree(model.parameters(), lr=1e-3, warmup_steps=100)\n\n# 3. Define a loss function\ncriterion = nn.MSELoss()\n\n# 4. Dummy data for demonstration\ninputs = torch.randn(64, 10)\ntargets = torch.randn(64, 1)\n\n# 5. Training loop (simplified)\nnum_epochs = 10\nfor epoch in range(num_epochs):\n    model.train() # Standard PyTorch model training mode\n    optimizer.train() # REQUIRED for Schedule-Free optimizers\n\n    # Forward pass\n    outputs = model(inputs)\n    loss = criterion(outputs, targets)\n\n    # Backward and optimize\n    optimizer.zero_grad()\n    loss.backward()\n    optimizer.step()\n\n    if (epoch + 1) % 2 == 0:\n        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')\n\n    # Evaluation phase (e.g., for validation or checkpointing)\n    model.eval() # Standard PyTorch model evaluation mode\n    optimizer.eval() # REQUIRED for Schedule-Free optimizers before evaluation/checkpointing\n    with torch.no_grad():\n        val_inputs = torch.randn(16, 10)\n        val_targets = torch.randn(16, 1)\n        val_outputs = model(val_inputs)\n        val_loss = criterion(val_outputs, val_targets)\n        # In a real scenario, you'd calculate metrics on val_outputs and val_targets\n\nprint(\"Training complete.\")\n","lang":"python","description":"This quickstart demonstrates how to integrate `AdamWScheduleFree` into a basic PyTorch training loop. Key steps include initializing the optimizer, performing forward/backward passes, and crucially, calling `optimizer.train()` and `optimizer.eval()` alongside `model.train()` and `model.eval()` for correct parameter buffer handling during training and evaluation/checkpointing.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-12","installed_version":null,"pypi_latest":"1.4.1","is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":50,"avg_install_s":null,"avg_import_s":null,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"schedulefree","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"18.0M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"schedulefree","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"schedulefree","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"19.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"schedulefree","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"schedulefree","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"11.8M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"schedulefree","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"schedulefree","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"11.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"schedulefree","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"schedulefree","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"17.5M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"schedulefree","exit_code":1,"wheel_type":null,"failure_reason":"timeout","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]}}