zhan1206 commited on
Commit
04c7011
·
1 Parent(s): 72148ec

Train: Add 10-step training test (loss decreases steadily)

Browse files
Files changed (1) hide show
  1. train/train_10steps.py +134 -0
train/train_10steps.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 小训练脚本 - 训练 10 步(验证损失持续下降)
3
+ """
4
+ import sys
5
+ import torch
6
+ import torch.optim as optim
7
+ sys.path.insert(0, '.')
8
+
9
+ from models.fusion_mini import FusionMini, FusionMiniConfig
10
+
11
+
12
+ def train_small():
13
+ """小训练(10 步)"""
14
+ print("[TRAIN] 开始小训练(10 步)...")
15
+ print()
16
+
17
+ # 1. 创建小配置
18
+ print("[1] 创建模型配置...")
19
+ config = FusionMiniConfig(
20
+ vocab_size=1000, # 小词表
21
+ hidden_size=64, # 小隐层
22
+ num_hidden_layers=2, # 2 层
23
+ num_attention_heads=2, # 2 个注意力头
24
+ intermediate_size=128,
25
+ max_position_embeddings=64,
26
+ )
27
+ print(f" 词汇表大小: {config.vocab_size}")
28
+ print(f" 隐藏层大小: {config.hidden_size}")
29
+ print(f" 层数: {config.num_hidden_layers}")
30
+ print()
31
+
32
+ # 2. 创建模型
33
+ print("[2] 创建模型...")
34
+ model = FusionMini(config)
35
+ model.train() # 训练模式
36
+ param_count = sum(p.numel() for p in model.parameters()) / 1e3
37
+ print(f" 参数量: {param_count:.1f}K")
38
+ print(" 模型创建成功")
39
+ print()
40
+
41
+ # 3. 创建优化器
42
+ print("[3] 创建优化器...")
43
+ optimizer = optim.AdamW(
44
+ model.parameters(),
45
+ lr=5e-4, # 稍大的学习率
46
+ weight_decay=0.01,
47
+ )
48
+ print(" 优化器创建成功")
49
+ print()
50
+
51
+ # 4. 创建假数据(小批次)
52
+ print("[4] 创建假数据...")
53
+ batch_size = 4
54
+ seq_len = 16
55
+
56
+ input_ids = torch.randint(0, config.vocab_size, (batch_size, seq_len))
57
+ labels = torch.randint(0, config.vocab_size, (batch_size, seq_len))
58
+
59
+ print(f" 输入形状: {input_ids.shape}")
60
+ print(f" 标签形状: {labels.shape}")
61
+ print(" 假数据创建成功")
62
+ print()
63
+
64
+ # 5. 训练 10 步
65
+ print("[5] 训练 10 步...")
66
+ losses = []
67
+
68
+ for step in range(10):
69
+ # 清零梯度
70
+ optimizer.zero_grad()
71
+
72
+ # 前向传播
73
+ outputs = model(
74
+ input_ids=input_ids,
75
+ labels=labels,
76
+ return_dict=True,
77
+ )
78
+
79
+ loss = outputs["loss"]
80
+ losses.append(loss.item())
81
+
82
+ # 反向传播
83
+ loss.backward()
84
+
85
+ # 更新参数
86
+ optimizer.step()
87
+
88
+ print(f" Step {step+1:2d}: Loss = {loss.item():.4f}")
89
+
90
+ print(" 训练完成")
91
+ print()
92
+
93
+ # 6. 验证损失下降
94
+ print("[6] 验证损失下降...")
95
+ initial_loss = losses[0]
96
+ final_loss = losses[-1]
97
+ is_decreasing = final_loss < initial_loss
98
+
99
+ print(f" 初始 Loss: {initial_loss:.4f}")
100
+ print(f" 最终 Loss: {final_loss:.4f}")
101
+ print(f" Loss 变化: {final_loss - initial_loss:+.4f}")
102
+ print()
103
+
104
+ if is_decreasing:
105
+ print(" [PASS] Loss 持续下降")
106
+ print(" 训练有效!")
107
+ else:
108
+ print(" [WARN] Loss 未下降")
109
+ print(" 可能的问题:学习率太大 / 数据太少 / 模型太小")
110
+ print()
111
+
112
+ print("[TRAIN] 小训练完成")
113
+ return is_decreasing
114
+
115
+
116
+ if __name__ == "__main__":
117
+ print("=" * 60)
118
+ print("Fusion-LLM 小训练(10 步)")
119
+ print("=" * 60)
120
+ print()
121
+
122
+ try:
123
+ success = train_small()
124
+ if success:
125
+ print()
126
+ print("[PASS] 训练测试通过")
127
+ except Exception as e:
128
+ print()
129
+ print(f"[FAIL] 训练测试出错: {e}")
130
+ import traceback
131
+ traceback.print_exc()
132
+ sys.exit(1)
133
+
134
+ sys.exit(0)