fix load model and lr update

pull/240/head
Eric 2025-03-01 00:40:01 +08:00
parent dc0708af11
commit 1c884f47af
4 changed files with 28 additions and 24 deletions

View File

@ -59,16 +59,17 @@ def train_epoch(epoch, wandb):
total_steps = iter_per_epoch * args.epochs total_steps = iter_per_epoch * args.epochs
warmup_steps = int(total_steps * 0.005) warmup_steps = int(total_steps * 0.005)
decay_steps = int(total_steps * 0.9) decay_steps = int(total_steps * 0.9)
if epoch == 0:
for param_group in optimizer.param_groups: # 在此处设置学习率
param_group['lr'] = 5e-6
start_time = time.time() start_time = time.time()
for step, (X, Y, loss_mask) in enumerate(train_loader): for step, (X, Y, loss_mask) in enumerate(train_loader):
X = X.to(args.device) X = X.to(args.device)
Y = Y.to(args.device) Y = Y.to(args.device)
loss_mask = loss_mask.to(args.device) loss_mask = loss_mask.to(args.device)
lr = get_dynamic_lr(step_base + step, warmup_steps, decay_steps, args.learning_rate)
for param_group in optimizer.param_groups:
param_group['lr'] = lr
with ctx: with ctx:
res = model(X) res = model(X)
loss = loss_fct( loss = loss_fct(
@ -82,6 +83,11 @@ def train_epoch(epoch, wandb):
scaler.scale(loss).backward() scaler.scale(loss).backward()
if (step + 1) % args.accumulation_steps == 0: if (step + 1) % args.accumulation_steps == 0:
current_step = step_base + step # 计算当前总步数
lr = get_dynamic_lr(current_step, warmup_steps, decay_steps, args.learning_rate)
for param_group in optimizer.param_groups: # 在此处设置学习率
param_group['lr'] = lr
scaler.unscale_(optimizer) scaler.unscale_(optimizer)
torch.nn.utils.clip_grad_norm_(model.parameters(), args.grad_clip) torch.nn.utils.clip_grad_norm_(model.parameters(), args.grad_clip)
@ -140,25 +146,6 @@ def save_checkpoint(buffer: io.BytesIO, path):
f.write(buffer.getvalue()) f.write(buffer.getvalue())
def init_model(cli_args):
lm_config = LMConfig(
dim=cli_args.dim,
n_layers=cli_args.n_layers,
n_heads=cli_args.n_heads,
n_kv_heads=cli_args.n_kv_heads,
max_seq_len=cli_args.max_seq_len,
use_moe=cli_args.use_moe,
use_mla=cli_args.use_mla,
torch_dtype=cli_args.dtype,
)
tokenizer = AutoTokenizer.from_pretrained(f'./model/{cli_args.vocab}_tokenizer')
# tokenizer = AutoTokenizer.from_pretrained('./deepseek_v3_tokenizer')
lm_config.vocab_size = tokenizer.vocab_size
model = MiniMindLM(lm_config)
Logger(f'LLM总参数量:{sum(p.numel() for p in model.parameters() if p.requires_grad) / 1e6:.3f} 百万')
return model, tokenizer
def init_distributed_mode(): def init_distributed_mode():
if not ddp: return if not ddp: return
global ddp_local_rank, DEVICE global ddp_local_rank, DEVICE
@ -173,6 +160,9 @@ def init_distributed_mode():
# torchrun --nproc_per_node 2 1-pretrain.py # torchrun --nproc_per_node 2 1-pretrain.py
if __name__ == "__main__": if __name__ == "__main__":
# 启用动态显存段扩展
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
parser = argparse.ArgumentParser(description="MiniMind Pretraining") parser = argparse.ArgumentParser(description="MiniMind Pretraining")
parser.add_argument("--save_dir", type=str, default="out") parser.add_argument("--save_dir", type=str, default="out")
# 若要以最快速度实现zero则epochs设置为1轮;否则应当利用有限的数据训练2~6个epochs。 # 若要以最快速度实现zero则epochs设置为1轮;否则应当利用有限的数据训练2~6个epochs。
@ -233,7 +223,21 @@ if __name__ == "__main__":
else: else:
wandb = None wandb = None
model, tokenizer = init_model(args) lm_config = LMConfig(
dim=args.dim,
n_layers=args.n_layers,
n_heads=args.n_heads,
n_kv_heads=args.n_kv_heads,
max_seq_len=args.max_seq_len,
use_moe=args.use_moe,
use_mla=args.use_mla,
torch_dtype=args.dtype,
)
tokenizer = AutoTokenizer.from_pretrained(f'./model/{args.vocab}_tokenizer')
lm_config.vocab_size = tokenizer.vocab_size
model = MiniMindLM(lm_config)
Logger(f'LLM总参数量:{sum(p.numel() for p in model.parameters() if p.requires_grad) / 1e6:.3f} 百万')
if args.ckpt_path is not None: if args.ckpt_path is not None:
# 接着训练 # 接着训练
state_dict = torch.load(args.ckpt_path, map_location=args.device) state_dict = torch.load(args.ckpt_path, map_location=args.device)