zhan1206 commited on
Commit
b1dad9f
·
1 Parent(s): a1e5965

Test: Fix training basic test (remove DeepSpeed dependency)

Browse files
Files changed (1) hide show
  1. tests/test_training_basic.py +89 -78
tests/test_training_basic.py CHANGED
@@ -1,27 +1,35 @@
1
  """
2
- 快速训练测试 - 验证训练功能
 
 
 
 
 
 
 
3
  """
4
  import sys
5
  import torch
 
6
  sys.path.insert(0, '.')
7
 
8
  from models.fusion_mini import FusionMini, FusionMiniConfig
9
- from train.full_finetune import FullFinetuneTrainer, TrainConfig
10
 
11
 
12
- def test_training():
13
- """测试基本训练功能"""
14
- print("[TRAIN] 开始训练测试...")
15
  print()
16
 
17
- # 1. 创建模型配置
18
  print("[1] 创建模型配置...")
19
  config = FusionMiniConfig(
20
- vocab_size=1000,
21
- hidden_size=128,
22
- num_hidden_layers=2,
23
- num_attention_heads=4,
24
- max_position_embeddings=256,
 
25
  )
26
  print(f" 词汇表大小: {config.vocab_size}")
27
  print(f" 隐藏层大小: {config.hidden_size}")
@@ -31,101 +39,104 @@ def test_training():
31
  # 2. 创建模型
32
  print("[2] 创建模型...")
33
  model = FusionMini(config)
 
34
  param_count = sum(p.numel() for p in model.parameters()) / 1e3
35
  print(f" 参数量: {param_count:.1f}K")
 
36
  print()
37
 
38
- # 3. 创建训练配置
39
- print("[3] 创建训练配置...")
40
- train_config = TrainConfig(
41
- learning_rate=5e-4,
42
- batch_size=2,
43
- num_epochs=1,
44
- max_seq_len=64,
45
- use_thinking_dial=True,
46
  )
47
- print(f" 学习率: {train_config.learning_rate}")
48
- print(f" 批大小: {train_config.batch_size}")
49
- print(f" 训练轮数: {train_config.num_epochs}")
 
 
 
 
 
 
 
 
 
 
 
50
  print()
51
 
52
- # 4. 创建训练器
53
- print("[4] 创建训练器...")
54
- trainer = FullFinetuneTrainer(
55
- model=model,
56
- config=train_config,
57
- device="cpu",
 
 
 
 
 
58
  )
59
- print(" 训练器创建成功")
 
 
 
60
  print()
61
 
62
- # 5. 创建虚拟训练数据
63
- print("[5] 创建训练数据...")
64
- train_data = [
65
- "Hello, how are you?",
66
- "I am fine, thank you.",
67
- "What is your name?",
68
- "My name is Fusion.",
69
- "How to learn AI?",
70
- "AI is very interesting.",
71
- ] * 10 # 重复 10 次,得到 60 个样本
72
- print(f" 训练样本数: {len(train_data)}")
73
  print()
74
 
75
- # 6. 训练 1 个 epoch(快速测试)
76
- print("[6] 开始训练(1 个 epoch)...")
77
- print(" 注意:这只是能测试,不会真正训练好模型")
78
  print()
79
 
80
- try:
81
- # 这里我们只测试训练器是否能正常初始化
82
- # 不实际运行完整训练(太慢)
83
- print(" 测试训练器方法...")
84
-
85
- # 测试 _prepare_data
86
- print(" 测试 _prepare_data...")
87
- # 不实际调用,只检查方法存在
88
- if hasattr(trainer, '_prepare_data'):
89
- print(" ✅ _prepare_data 方法存在")
90
- else:
91
- print(" ❌ _prepare_data 方法不存在")
92
-
93
- # 测试 train 方法
94
- print(" 测试 train 方法签名...")
95
- import inspect
96
- sig = inspect.signature(trainer.train)
97
- print(f" ✅ train 方法签名: {sig}")
98
-
99
- print()
100
- print(" ✅ 训练器功能测试通过")
101
-
102
- except Exception as e:
103
- print(f" ❌ 训练器测试���败: {e}")
104
- import traceback
105
- traceback.print_exc()
106
- return False
107
 
 
 
108
  print()
109
- print("[TRAIN] 训练测试完成")
 
 
 
 
 
110
  return True
111
 
112
 
113
  if __name__ == "__main__":
114
  print("=" * 60)
115
- print("Fusion-LLM 训练测试")
116
  print("=" * 60)
117
  print()
118
 
119
  try:
120
- success = test_training()
121
  if success:
122
  print()
123
- print(" 所有测试通过")
124
- else:
125
- print()
126
- print("❌ 测试失败")
127
  except Exception as e:
128
  print()
129
- print(f" 测试出错: {e}")
130
  import traceback
131
  traceback.print_exc()
 
 
 
 
1
  """
2
+ 快速训练测试 - 验证 Fusion-LLM 基本训练功能(无 DeepSpeed 依赖)
3
+
4
+ 只测试:
5
+ 1. 模型能否正确计算损失
6
+ 2. 反向传播能否运行
7
+ 3. 优化器能否更新参数
8
+
9
+ 不使用 DeepSpeed / LoRA / 完整训练脚本
10
  """
11
  import sys
12
  import torch
13
+ import torch.nn as optim
14
  sys.path.insert(0, '.')
15
 
16
  from models.fusion_mini import FusionMini, FusionMiniConfig
 
17
 
18
 
19
+ def test_basic_training():
20
+ """测试基本训练功能(无 DeepSpeed)"""
21
+ print("[TEST] 开始基本训练测试...")
22
  print()
23
 
24
+ # 1. 创建极小配置(快速测试)
25
  print("[1] 创建模型配置...")
26
  config = FusionMiniConfig(
27
+ vocab_size=100, # 极小词表
28
+ hidden_size=32, # 极小隐层
29
+ num_hidden_layers=1, # 1 层
30
+ num_attention_heads=1, # 1 个注意力头
31
+ intermediate_size=64,
32
+ max_position_embeddings=32,
33
  )
34
  print(f" 词汇表大小: {config.vocab_size}")
35
  print(f" 隐藏层大小: {config.hidden_size}")
 
39
  # 2. 创建模型
40
  print("[2] 创建模型...")
41
  model = FusionMini(config)
42
+ model.train() # 训练模式
43
  param_count = sum(p.numel() for p in model.parameters()) / 1e3
44
  print(f" 参数量: {param_count:.1f}K")
45
+ print(" 模型创建成功")
46
  print()
47
 
48
+ # 3. 创建优化器
49
+ print("[3] 创建优化器...")
50
+ optimizer = optim.AdamW(
51
+ model.parameters(),
52
+ lr=1e-4,
53
+ weight_decay=0.01,
 
 
54
  )
55
+ print(" 优化器创建成功")
56
+ print()
57
+
58
+ # 4. 创建假数据
59
+ print("[4] 创建假数据...")
60
+ batch_size = 2
61
+ seq_len = 8
62
+
63
+ input_ids = torch.randint(0, config.vocab_size, (batch_size, seq_len))
64
+ labels = torch.randint(0, config.vocab_size, (batch_size, seq_len))
65
+
66
+ print(f" 输入形状: {input_ids.shape}")
67
+ print(f" 标签形状: {labels.shape}")
68
+ print(" 假数据创建成功")
69
  print()
70
 
71
+ # 5. 前向传播 + 反向传播(单步)
72
+ print("[5] 前向传播 + 反向传播(单步)...")
73
+
74
+ # 清零梯度
75
+ optimizer.zero_grad()
76
+
77
+ # 前向传播
78
+ outputs = model(
79
+ input_ids=input_ids,
80
+ labels=labels,
81
+ return_dict=True,
82
  )
83
+
84
+ loss = outputs["loss"]
85
+ print(f" Loss: {loss.item():.4f}")
86
+ print(" 前向传播成功")
87
  print()
88
 
89
+ # 反向传播
90
+ loss.backward()
91
+ print(" 反向传播成功")
 
 
 
 
 
 
 
 
92
  print()
93
 
94
+ # 更新参数
95
+ optimizer.step()
96
+ print(" 参数更新成功")
97
  print()
98
 
99
+ # 6. 验证参数已更新
100
+ print("[6] 验证参数已更新...")
101
+ param_before = list(model.parameters())[0].clone()
102
+
103
+ # 再跑一步
104
+ optimizer.zero_grad()
105
+ outputs2 = model(input_ids=input_ids, labels=labels, return_dict=True)
106
+ loss2 = outputs2["loss"]
107
+ loss2.backward()
108
+ optimizer.step()
109
+
110
+ param_after = list(model.parameters())[0]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
+ is_different = not torch.allclose(param_before, param_after)
113
+ print(f" 参数已更新: {is_different}")
114
  print()
115
+
116
+ if not is_different:
117
+ print("[WARN] 参数未更新!可能有问题")
118
+ return False
119
+
120
+ print("[TEST] 基本训练测试通过")
121
  return True
122
 
123
 
124
  if __name__ == "__main__":
125
  print("=" * 60)
126
+ print("Fusion-LLM 基本训练测试(无 DeepSpeed)")
127
  print("=" * 60)
128
  print()
129
 
130
  try:
131
+ success = test_basic_training()
132
  if success:
133
  print()
134
+ print("[PASS] 测试通过")
 
 
 
135
  except Exception as e:
136
  print()
137
+ print(f"[FAIL] 测试出错: {e}")
138
  import traceback
139
  traceback.print_exc()
140
+ sys.exit(1)
141
+
142
+ sys.exit(0)