Spaces:
Running
Running
| """ | |
| 快速训练测试 - 验证 Fusion-LLM 基本训练功能(无 DeepSpeed 依赖) | |
| 只测试: | |
| 1. 模型能否正确计算损失 | |
| 2. 反向传播能否运行 | |
| 3. 优化器能否更新参数 | |
| 不使用 DeepSpeed / LoRA / 完整训练脚本 | |
| """ | |
| import sys | |
| import torch | |
| import torch.optim as optim # 正确:AdamW 在 torch.optim 中 | |
| sys.path.insert(0, '.') | |
| from models.fusion_mini import FusionMini, FusionMiniConfig | |
| def test_basic_training(): | |
| """测试基本训练功能(无 DeepSpeed)""" | |
| print("[TEST] 开始基本训练测试...") | |
| print() | |
| # 1. 创建极小配置(快速测试) | |
| print("[1] 创建模型配置...") | |
| config = FusionMiniConfig( | |
| vocab_size=100, # 极小词表 | |
| hidden_size=32, # 极小隐层 | |
| num_hidden_layers=1, # 1 层 | |
| num_attention_heads=1, # 1 个注意力头 | |
| intermediate_size=64, | |
| max_position_embeddings=32, | |
| ) | |
| print(f" 词汇表大小: {config.vocab_size}") | |
| print(f" 隐藏层大小: {config.hidden_size}") | |
| print(f" 层数: {config.num_hidden_layers}") | |
| print() | |
| # 2. 创建模型 | |
| print("[2] 创建模型...") | |
| model = FusionMini(config) | |
| model.train() # 训练模式 | |
| param_count = sum(p.numel() for p in model.parameters()) / 1e3 | |
| print(f" 参数量: {param_count:.1f}K") | |
| print(" 模型创建成功") | |
| print() | |
| # 3. 创建优化器(正确:torch.optim.AdamW) | |
| print("[3] 创建优化器...") | |
| optimizer = optim.AdamW( | |
| model.parameters(), | |
| lr=1e-4, | |
| weight_decay=0.01, | |
| ) | |
| print(" 优化器创建成功") | |
| print() | |
| # 4. 创建假数据 | |
| print("[4] 创建假数据...") | |
| batch_size = 2 | |
| seq_len = 8 | |
| input_ids = torch.randint(0, config.vocab_size, (batch_size, seq_len)) | |
| labels = torch.randint(0, config.vocab_size, (batch_size, seq_len)) | |
| print(f" 输入形状: {input_ids.shape}") | |
| print(f" 标签形状: {labels.shape}") | |
| print(" 假数据创建成功") | |
| print() | |
| # 5. 前向传播 + 反向传播(单步) | |
| print("[5] 前向传播 + 反向传播(单步)...") | |
| # 清零梯度 | |
| optimizer.zero_grad() | |
| # 前向传播 | |
| outputs = model( | |
| input_ids=input_ids, | |
| labels=labels, | |
| return_dict=True, | |
| ) | |
| loss = outputs["loss"] | |
| print(f" Loss: {loss.item():.4f}") | |
| print(" 前向传播成功") | |
| print() | |
| # 反向传播 | |
| loss.backward() | |
| print(" 反向传播成功") | |
| print() | |
| # 更新参数 | |
| optimizer.step() | |
| print(" 参数更新成功") | |
| print() | |
| # 6. 验证参数已更新 | |
| print("[6] 验证参数已更新...") | |
| param_before = list(model.parameters())[0].clone() | |
| # 再跑一步 | |
| optimizer.zero_grad() | |
| outputs2 = model(input_ids=input_ids, labels=labels, return_dict=True) | |
| loss2 = outputs2["loss"] | |
| loss2.backward() | |
| optimizer.step() | |
| param_after = list(model.parameters())[0] | |
| is_different = not torch.allclose(param_before, param_after) | |
| print(f" 参数已更新: {is_different}") | |
| print() | |
| assert is_different, "参数未更新!可能有问题" | |
| print("[TEST] 基本训练测试通过") | |
| # test passes if no exception | |
| if __name__ == "__main__": | |
| print("=" * 60) | |
| print("Fusion-LLM 基本训练测试(无 DeepSpeed)") | |
| print("=" * 60) | |
| print() | |
| try: | |
| success = test_basic_training() | |
| if success: | |
| print() | |
| print("[PASS] 测试通过") | |
| except Exception as e: | |
| print() | |
| print(f"[FAIL] 测试出错: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| sys.exit(1) | |
| sys.exit(0) | |