JinghuiLuAstronaut's picture
Add files using upload-large-folder tool
1e28297 verified
Raw
History Blame Contribute Delete
2.42 kB
from __future__ import annotations
import inspect
import math
import torch
def compute_elf_lr(lr: float, blr: float, effective_batch_size: int) -> float:
if lr is not None and lr > 0:
return float(lr)
return float(blr) * float(effective_batch_size) / 256.0
def create_learning_rate_fn(
num_train_steps: int,
num_warmup_steps: int,
learning_rate: float,
schedule: str = "constant",
min_lr: float = 0.0,
):
"""ELF pytorch_elf linear warmup schedule, returning absolute LR."""
alpha = (min_lr / learning_rate) if learning_rate > 0 else 0.0
def fn(step: int) -> float:
step = int(step)
if num_warmup_steps > 0 and step < num_warmup_steps:
return learning_rate * step / max(1, num_warmup_steps)
if schedule == "cosine":
progress = (step - num_warmup_steps) / max(1, num_train_steps - num_warmup_steps)
progress = min(max(progress, 0.0), 1.0)
cosine = 0.5 * (1.0 + math.cos(math.pi * progress))
return learning_rate * (alpha + (1.0 - alpha) * cosine)
return learning_rate
return fn
def build_optimizer(args, model: torch.nn.Module, world_size: int) -> torch.optim.Optimizer:
effective_batch = int(args.batch_size) * int(world_size) * int(args.grad_accum)
args.effective_batch_size = effective_batch
args.lr = compute_elf_lr(float(args.lr), float(args.blr), effective_batch)
if args.optimizer == "muon":
from utils.muon_utils import muon_with_aux_adam
return muon_with_aux_adam(model, lr=args.lr)
params = [p for p in model.parameters() if p.requires_grad]
fused = "fused" in inspect.signature(torch.optim.AdamW).parameters and torch.cuda.is_available()
return torch.optim.AdamW(
params,
lr=args.lr,
weight_decay=args.weight_decay,
betas=(args.adam_beta1, args.adam_beta2),
eps=args.adam_eps,
fused=fused,
)
def build_lr_scheduler(args, optimizer: torch.optim.Optimizer):
lr_fn = create_learning_rate_fn(
num_train_steps=args.steps,
num_warmup_steps=args.warmup_steps,
learning_rate=args.lr,
schedule=args.lr_schedule,
min_lr=args.min_lr,
)
base_lr = optimizer.param_groups[0]["lr"]
return torch.optim.lr_scheduler.LambdaLR(
optimizer,
lr_lambda=lambda step: lr_fn(step) / max(base_lr, 1e-12),
)