Compare commits

...

4 Commits

Author SHA1 Message Date
Jonathan Hill 9ad13f7036
Merge 182bff1bd8 into 3f1a7cc25b 2026-06-09 21:44:26 +08:00
jingyaogong 3f1a7cc25b [fix] ddp exit hang 2026-06-01 17:50:39 +08:00
jingyaogong 4a68da72d5 [fix] lora dims 2026-05-31 13:38:51 +08:00
Jonathan Hill 182bff1bd8 fix: guard against empty/filtered LLM responses in chat_api.py
Add null check before accessing choices[0].message.content in the
non-streaming path. An empty choices list causes IndexError; a None
message (returned by some providers on content-filtered responses
with HTTP 200) causes AttributeError.
2026-05-18 03:44:31 -05:00
10 changed files with 28 additions and 10 deletions

View File

@ -20,8 +20,8 @@ class LoRA(nn.Module):
def apply_lora(model, rank=16): def apply_lora(model, rank=16):
for name, module in model.named_modules(): for name, module in model.named_modules():
if isinstance(module, nn.Linear) and module.weight.shape[0] == module.weight.shape[1]: if isinstance(module, nn.Linear) and module.in_features == module.out_features:
lora = LoRA(module.weight.shape[0], module.weight.shape[1], rank=rank).to(model.device) lora = LoRA(module.in_features, module.out_features, rank=rank).to(model.device)
setattr(module, "lora", lora) setattr(module, "lora", lora)
original_forward = module.forward original_forward = module.forward

View File

@ -21,6 +21,8 @@ while True:
extra_body={"chat_template_kwargs": {"open_thinking": True}, "reasoning_effort": "medium"} # 思考开关 extra_body={"chat_template_kwargs": {"open_thinking": True}, "reasoning_effort": "medium"} # 思考开关
) )
if not stream: if not stream:
if not response.choices or response.choices[0].message is None:
raise ValueError("LLM returned empty or filtered response")
assistant_res = response.choices[0].message.content assistant_res = response.choices[0].message.content
print('[A]: ', assistant_res) print('[A]: ', assistant_res)
else: else:

View File

@ -487,4 +487,6 @@ if __name__ == "__main__":
else: else:
rl_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang")) rl_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -243,4 +243,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), teacher_model, lm_config_student, 0, wandb, args.alpha, args.temperature) train_epoch(epoch, loader, len(loader), teacher_model, lm_config_student, 0, wandb, args.alpha, args.temperature)
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -223,4 +223,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), ref_model, lm_config, 0, wandb, args.beta) train_epoch(epoch, loader, len(loader), ref_model, lm_config, 0, wandb, args.beta)
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -168,4 +168,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), 0, wandb) train_epoch(epoch, loader, len(loader), 0, wandb)
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -329,4 +329,6 @@ if __name__ == "__main__":
grpo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang")) grpo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -181,4 +181,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), lora_params, 0, wandb) train_epoch(epoch, loader, len(loader), lora_params, 0, wandb)
# ========== 10. 清理分布进程 ========== # ========== 10. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -432,4 +432,6 @@ if __name__ == "__main__":
ppo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, actor_scheduler, critic_scheduler, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang")) ppo_train_epoch(epoch, loader, len(loader), rollout_engine, ref_model, actor_scheduler, critic_scheduler, reward_model, 0, wandb, use_sglang = (args.rollout_engine == "sglang"))
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()

View File

@ -167,4 +167,6 @@ if __name__ == "__main__":
train_epoch(epoch, loader, len(loader), 0, wandb) train_epoch(epoch, loader, len(loader), 0, wandb)
# ========== 9. 清理分布进程 ========== # ========== 9. 清理分布进程 ==========
if dist.is_initialized(): dist.destroy_process_group() if dist.is_initialized():
dist.barrier()
dist.destroy_process_group()