chenbhao commited on
Commit
64d62ee
·
1 Parent(s): aefd3e0

cleanup: remove deprecated doc files, update src training utils

Browse files
.gitignore CHANGED
@@ -7,11 +7,11 @@ wheels/
7
  *.egg-info
8
 
9
  # dataset
10
- dataset/pretrain_t2t_mini.jsonl
11
- dataset/sft_t2t_mini.jsonl
12
- dataset/dpo.jsonl
13
- dataset/rlaif.jsonl
14
- dataset/agent_rl.jsonl
15
- dataset/agent_rl_math.jsonl
16
  # Virtual environments
17
  .venv
 
7
  *.egg-info
8
 
9
  # dataset
10
+ # dataset/pretrain_t2t_mini.jsonl
11
+ # dataset/sft_t2t_mini.jsonl
12
+ # dataset/dpo.jsonl
13
+ # dataset/rlaif.jsonl
14
+ # dataset/agent_rl.jsonl
15
+ # dataset/agent_rl_math.jsonl
16
  # Virtual environments
17
  .venv
docs/dataset/index.md DELETED
@@ -1,33 +0,0 @@
1
- # data/ · 数据集
2
-
3
- `dataset/` 下**每类数据集一个文件**(已去掉 `_dataset` 后缀),公共辅助函数在 `common.py`。
4
-
5
- | 文件 | 数据集 | 用途 |
6
- | --- | --- | --- |
7
- | `pretrain.py` | `PretrainDataset` | 预训练(纯文本) |
8
- | `sft.py` | `SFTDataset` | 全量 SFT(chat 模板 + loss mask) |
9
- | `dpo.py` | `DPODataset` | DPO 偏好数据 |
10
- | `rlaif.py` | `RLAIFDataset` | RLHF/RLAIF prompt 采样 |
11
- | `agent_rl.py` | `AgentRLDataset` | Agent 强化学习轨迹 |
12
- | `vlm.py` | `VLMDataset` | 图文对(parquet) |
13
- | `vam.py` | `VAMDataset` | 全模态(图文 + 音频,parquet) |
14
-
15
- 统一从 `dataset`(本仓库包)导入,例如 `from dataset import SFTDataset`。
16
-
17
- ## 共同模式
18
-
19
- - 都继承 `torch.utils.data.Dataset`,实现 `__len__` / `__getitem__`。
20
- - 文本类通过 `tokenizer.apply_chat_template` 渲染对话;用 `bos_id/eos_id` 在 `generate_labels` 里**只对 assistant 回复计算损失**(prompt 部分 label=-100)。
21
- - 多模态(`vlm`/`vam`)额外加载图像/音频,并产出 `(input_ids, labels, 视觉/音频特征)` 元组。
22
-
23
- ## 训练时拼 batch
24
-
25
- - `trainers/lm/*` 用 `SkipBatchSampler` + `DataLoader`;
26
- - `vlm` 用 `vlm_collate_fn`(把变长视觉特征 pad/stack);
27
- - `vam` 的 `VAMDataset.__getitem__` 直接返回定长张量(文本+音频各层 label + 音频特征 + spk_emb)。
28
-
29
- ## 要点(面试)
30
-
31
- - **loss mask 为什么只标 assistant?** 让模型只学习生成回复,不拟合用户输入/系统提示,避免「学用户说话」。
32
- - 多模态数据常用 parquet + `HFDataset.from_parquet`,便于大批量流式读取。
33
- - `pre_processing_chat` 随机插入 system prompt,`post_processing_chat` 随机去掉空 think 段,做数据增广。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/encoders/index.md DELETED
@@ -1,14 +0,0 @@
1
- # encoders/ · 多模态编码器
2
-
3
- 把「外部模态」的原始信号编码为模态特征,冻结预训练权重、不参与 LLM 主干训练。
4
-
5
- | 文件 | 类 | 作用 |
6
- | --- | --- | --- |
7
- | `encoders/vision/siglip.py` | `SiglipVisionEncoder` | 图像 → patch 特征(SigLIP) |
8
- | `encoders/audio/sensevoice.py` | `SenseVoiceAudioEncoder` | 语音 → 语义/声学特征(SenseVoice) |
9
-
10
- ## 设计要点(面试)
11
-
12
- - **encoder 冻结 + 只训 projector**:大模型主干易灾难性遗忘,冻结预训练视觉/音频 encoder、只训轻量投影层,是高效多模态对齐的常用做法。
13
- - **`encoders/` 与 `projectors/` 分离**:encoder 负责「理解模态」,projector 负责「对齐到 LLM 空间」,二者职责清晰、可独立替换。
14
- - **可扩展性**:加新模态 = 加一对 encoder+projector + 占位 token,主干不动(符合本仓库分层初衷)。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/overview.md DELETED
@@ -1,108 +0,0 @@
1
- # Omni 开发文档
2
-
3
- > Omni — 把 MiniMind / MiniMind-V / MiniMind-O 三套代码融合成一个按模态分层(文本 / 视觉 / 全模态)的训练 + 推理框架。面向**学习与面试**的模块化开发文档。
4
-
5
- 文档目录与 `src/` 代码模块一一对应:
6
-
7
- ```
8
- docs/ ↔ src/
9
- ├── architecture/ # 概念总览(入口,非代码模块)
10
- ├── core/ ↔ src/core/ 纯 Transformer 组件
11
- ├── models/ ↔ src/models/ lm / vlm / vam 模型拼装
12
- ├── dataset/ ↔ src/dataset/ 数据集
13
- ├── encoders/ ↔ src/encoders/ 视觉/音频编码器
14
- ├── projectors/ ↔ src/projectors/ 模态桥接层
15
- ├── serve/ ↔ src/serve/ 实时语音会话
16
- ├── trainers/ ↔ src/trainers/ 训练脚本
17
- ├── utils/ ↔ src/utils/ 训练/分布式/checkpoint 工具
18
- └── interview/ # 面试速查(学习辅助)
19
- ```
20
-
21
- ## 目录
22
-
23
- ### 架构(概念入口)
24
- | 文档 | 说明 |
25
- | --- | --- |
26
- | [架构总览](architecture/overview.md) | 能力分层设计、模型能力矩阵、前向数据流、训练入口、关键设计取舍 |
27
-
28
- ### core/(基础组件)
29
- | 文档 | 说明 |
30
- | --- | --- |
31
- | [组件索引](core/index.md) | 与模态无关的纯 Transformer 组件总览 |
32
- | [RMSNorm](core/norm.md) | RMSNorm 实现与数值技巧 |
33
- | [RoPE](core/rope.md) | 旋转位置编码(含 YaRN)、`repeat_kv` |
34
- | [Attention](core/attention.md) | 带 QK-Norm + GQA 的注意力 |
35
- | [MLP / MoE](core/mlp.md) | SwiGLU FFN 与 MoE 前馈 |
36
- | [Block](core/block.md) | Pre-Norm Transformer 块、MoE 可插拔 |
37
-
38
- ### models/(模型拼装)
39
- | 文档 | 说明 |
40
- | --- | --- |
41
- | [模型索引](models/index.md) | `lm` / `vlm` / `vam` 三子包拼装、继承链、共享主干 |
42
- | [LM](models/lm.md) | 纯文本主干 `LM` + `LMForCausalLM` |
43
- | [VLM](models/vlm.md) | 文本 + 图像(SigLIP 编码器 + 视觉投影) |
44
- | [VAM](models/vam.md) | 文本 + 图像 + 语音,`TalkerModule` 双 head |
45
-
46
- ### dataset/(数据集)
47
- | 文档 | 说明 |
48
- | --- | --- |
49
- | [数据集索引](dataset/index.md) | `dataset/` 每类一个文件的数据集、loss mask、批次拼接 |
50
-
51
- ### encoders/(多模态编码器)
52
- | 文档 | 说明 |
53
- | --- | --- |
54
- | [编码器索引](encoders/index.md) | `SiglipVisionEncoder` / `SenseVoiceAudioEncoder` |
55
-
56
- ### projectors/(模态桥接层)
57
- | 文档 | 说明 |
58
- | --- | --- |
59
- | [桥接层索引](projectors/index.md) | `MMVisionProjector` / `MMAudioProjector`、注入范式 |
60
-
61
- ### serve/(实时语音会话)
62
- | 文档 | 说明 |
63
- | --- | --- |
64
- | [服务索引](serve/index.md) | `SileroVAD` / `RealtimeSession` 端到端语音链路 |
65
-
66
- ### trainers/(训练脚本)
67
- | 文档 | 说明 |
68
- | --- | --- |
69
- | [训练索引](trainers/index.md) | 按模态组织的 trainer 模块分布 |
70
- | [Trainers](trainers/trainers.md) | 各 trainer 模块概览与通用训练循环 |
71
-
72
- ### utils/(训练工具)
73
- | 文档 | 说明 |
74
- | --- | --- |
75
- | [工具索引](utils/index.md) | `training` / `checkpoint` / `distributed` / `multimodal` 工具分布 |
76
- | [配置与命令行](utils/config-and-cli.md) | YAML 配置驱动训练、`apply_config` 机制、tokenizer 训练、启动示例 |
77
-
78
- ### 面试速查
79
- | 文档 | 说明 |
80
- | --- | --- |
81
- | [面试准备](interview/面试速查.md) | 高频问题 + 一句话答法,按主题组织 |
82
-
83
- ## 命名约定(本仓库)
84
-
85
- 类名已在融合过程中统一重命名,阅读代码/面试时对照:
86
-
87
- | 旧名(上游) | 本仓库 |
88
- | --- | --- |
89
- | `MiniMindModel` | `LM` |
90
- | `MiniMindForCausalLM` | `LMForCausalLM` |
91
- | `MiniMindConfig` | `LMConfig` |
92
- | `MiniMindVLM` | `VLM` |
93
- | `MiniMindOmni` | `VAM` |
94
- | `OmniConfig` | `VAMConfig` |
95
-
96
- 包结构(已扁平化,无 `omni` 中间层):
97
-
98
- ```
99
- src/
100
- ├── core/ # 纯组件:norm / rope / attention / mlp / block
101
- ├── models/ # lm / vlm / vam 三个子包(config + model)
102
- ├── dataset/ # 每类一个文件的数据集
103
- ├── encoders/ # vision / audio 编码器
104
- ├── projectors/ # 视觉/音频桥接层
105
- ├── serve/ # 实时语音会话
106
- ├── trainers/ # lm / vlm / vam 训练脚本
107
- └── utils/ # training / distributed / checkpoint / multimodal
108
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/projectors/index.md DELETED
@@ -1,21 +0,0 @@
1
- # projectors/ · 模态桥接层
2
-
3
- 把 encoder 输出的模态特征投影到 LLM 隐藏维度(`hidden_size`),随后替换 `input_ids` 中的占位 token 位置。
4
-
5
- | 文件 | 类 | 作用 |
6
- | --- | --- | --- |
7
- | `projectors/vision.py` | `MMVisionProjector` | 视觉特征 → LLM `hidden_size` |
8
- | `projectors/audio.py` | `MMAudioProjector` | 音频特征 → LLM `hidden_size` |
9
-
10
- ## 注入范式
11
-
12
- ```
13
- 原始输入(图/音)
14
- └─ encoder → 模态特征
15
- └─ projector → 投影到 hidden_size
16
- └─ 替换 input_ids 中的占位 token 位置的 embedding
17
- └─ 进入共享 LM 主干
18
- ```
19
-
20
- - 文本侧用特殊占位 token(`<|image_pad|>` / `<|audio_pad|>`)预留位置;
21
- - `forward` 把投影特征写到这些位置,LLM 对文本/视觉/音频 token 一视同仁。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/trainers/index.md DELETED
@@ -1,13 +0,0 @@
1
- # trainers/ · 训练脚本
2
-
3
- 按模态组织的训练入口,每个脚本暴露 `main(default_config=None)`(可由 `python -m trainers.<mod>` 或 `runs/*.sh` 调用)。
4
-
5
- - `trainers/lm/`:pretrain / full_sft / lora / dpo / distillation / ppo / grpo / agent / rollout_engine / train_tokenizer
6
- - `trainers/vlm/`:pretrain / full_sft
7
- - `trainers/vam/`:full_sft
8
-
9
- 相关:配置与 CLI 机制见 [../utils/config-and-cli.md](../utils/config-and-cli.md)(基于 `utils/training.apply_config`)。
10
-
11
- 详见:
12
-
13
- - [trainers.md](trainers.md) — 各 trainer 模块概览与通用训练循环
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/trainers/trainers.md DELETED
@@ -1,50 +0,0 @@
1
- # trainers/trainers.md · 训练脚本
2
-
3
- `trainers/` 按模态分子包,每个脚本暴露 `main(default_config=None)`(可由 `python -m trainers.<mod>` 或 `runs/*.sh` 调用)。
4
-
5
- ## 文本(lm/)
6
-
7
- | 脚本 | 任务 | 关键损失/算法 |
8
- | --- | --- | --- |
9
- | `pretrain.py` | 预训练 | 下一 token CE |
10
- | `full_sft.py` | 全量 SFT | CE(loss mask 仅 assistant) |
11
- | `lora.py` | LoRA 微调 | 低秩适配,仅训 A/B |
12
- | `dpo.py` | DPO | 偏好对齐(参考比损失) |
13
- | `distillation.py` | 知识蒸馏 | 师生 KL |
14
- | `ppo.py` | PPO | Actor-Critic + 奖励 |
15
- | `grpo.py` | GRPO | 分组相对策略优化 |
16
- | `agent.py` | Agent RL | 工具调用强化学习 |
17
- | `rollout_engine.py` | — | torch / sglang 推理引擎(被 ppo/grpo/agent 复用) |
18
- | `train_tokenizer.py` | — | tokenizer 训练(学习用),结果保存到 `checkpoint/tokenizer/` |
19
-
20
- ## 视觉(vlm/)
21
-
22
- - `pretrain.py`:视觉预训练
23
- - `full_sft.py`:视觉 SFT(含 `vlm_collate_fn`)
24
-
25
- ## 全模态(vam/)
26
-
27
- - `full_sft.py`:全模态 SFT(文本 + 视觉 + 音频,双 head 损失)
28
-
29
- ## 通用训练循环(以 full_sft 为例)
30
-
31
- ```python
32
- for epoch in range(epochs):
33
- loader = DataLoader(ds, batch_sampler=SkipBatchSampler(...))
34
- for step, (input_ids, labels) in enumerate(loader):
35
- loss = model(input_ids, labels=labels).loss + res.aux_loss
36
- loss = loss / accumulation_steps
37
- scaler.scale(loss).backward()
38
- if step % accumulation_steps == 0:
39
- clip_grad_norm_; scaler.step(optimizer); zero_grad()
40
- # 定期保存权重到 save_dir + 保存 optimizer/ckpt 到 checkpoint/
41
- ```
42
-
43
- 支持:分布式(`init_distributed_mode` + `DistributedDataParallel`)、混合精度(`autocast` + `GradScaler`)、梯度累积、断点续训(`from_resume`)、可选 wandb/swanlab。
44
-
45
- ## 要点(面试)
46
-
47
- - **`SkipBatchSampler`**:分布式下跳过已训 step,配合 `from_resume` 实现精确续训。
48
- - **`aux_loss`**:MoE 路由均衡损失,只在 `use_moe` 时非 0,需显式加到总损失。
49
- - **RL trainer 复用 `rollout_engine`**:生成样本与训练解耦,可换 torch / sglang 后端。
50
- - 保存分两份:`save_dir`(最终权重 `.pth`)+ `checkpoint/`(optimizer/scheduler 状态用于续训)。`train_tokenizer.py` 额外把训练出的 tokenizer 写到 `checkpoint/tokenizer/`。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/utils/config-and-cli.md DELETED
@@ -1,83 +0,0 @@
1
- # utils/config-and-cli.md · 配置与命令行
2
-
3
- ## 机制
4
-
5
- `utils/training.apply_config(parser, default_config=None)` 让 **YAML 成为 argparse 默认值,CLI 显式参数覆盖 YAML**:
6
-
7
- ```python
8
- def apply_config(parser, default_config=None):
9
- pre, _ = parser.parse_known_args() # 先读出 --config
10
- config_path = getattr(pre, 'config', None) or default_config
11
- if config_path and os.path.exists(config_path):
12
- defaults = _load_yaml_config(config_path)
13
- parser.set_defaults(**defaults) # 注入默认值
14
- return parser.parse_args() # 最终解析(CLI 覆盖)
15
- ```
16
-
17
- `_load_yaml_config` 把 YAML 的 `model / train / paths` 三段**扁平化**为顶层键:
18
- `model.hidden_size → hidden_size`,`train.epochs → epochs`,`paths.data_path → data_path` ……
19
- 这些键名与 trainer 的 `--hidden_size` / `--epochs` / `--data_path` 等 argparse 参数一一对应。
20
-
21
- ## 配置文件位置
22
-
23
- ```
24
- configs/
25
- ├── model/ # lm / lm_moe / vlm / vlm_moe / vam / vam_moe .yaml
26
- └── tokenizer/ # tokenizer.json / tokenizer_config.json
27
- ```
28
-
29
- 每个 YAML 例:
30
-
31
- ```yaml
32
- model:
33
- hidden_size: 768
34
- num_hidden_layers: 8
35
- use_moe: 0
36
- vocab_size: 6400
37
- train:
38
- epochs: 2
39
- batch_size: 16
40
- learning_rate: 1.0e-5
41
- from_weight: pretrain
42
- paths:
43
- save_dir: checkpoint/lm
44
- data_path: dataset/sft.jsonl
45
- ```
46
-
47
- ## 配置如何真正生效
48
-
49
- trainer 用 `LMConfig(**vars(args))`(或 `VLMConfig` / `VAMConfig`)构造模型配置,
50
- 因此 YAML 里**所有** `model` 字段(含 `vocab_size`、head 数、MoE 专家数、talker 层数等)
51
- 都会驱动模型结构,而非仅少数硬编码字段。
52
-
53
- ## 启动
54
-
55
- ```bash
56
- bash runs/lm.sh # 默认 configs/model/lm.yaml
57
- bash runs/vlm.sh --config configs/model/vlm_moe.yaml
58
- bash runs/vam.sh --epochs 10 # 覆盖单字段
59
- bash runs/train_tokenizer.sh # 训练 tokenizer(学习用),保存到 checkpoint/tokenizer/
60
- ```
61
-
62
- ## Tokenizer 训练
63
-
64
- `trainers/lm/train_tokenizer.py` 仅供学习参考(MiniMind 已自带 tokenizer,重复训练会导致词表不统一)。
65
- 训练得到的 tokenizer 直接保存到 **`checkpoint/tokenizer/`**(与模型权重同目录),包含:
66
-
67
- - `tokenizer.json` / `vocab.json` / `merges.txt`:BPE 词表
68
- - `tokenizer_config.json`:special token、chat template 等配置
69
-
70
- 常用参数:
71
-
72
- ```bash
73
- bash runs/train_tokenizer.sh --data_path dataset/sft_t2t_mini.jsonl \
74
- --vocab_size 6400 \
75
- --checkpoint_dir ../checkpoint \
76
- --no_eval
77
- ```
78
-
79
- ## 要点(面试)
80
-
81
- - 设计亮点:**单一事实源(YAML)+ CLI 覆盖**,实验可复现、参数可微调。
82
- - `set_defaults` 注入后,argparse 仍允许命令行覆盖 → 优先级 `CLI > YAML > 代码默认`。
83
- - 扁平化约定要求 YAML 键名与 `--arg` 名一致,故 `trainers` 的参数命名需与 YAML 段对齐。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
docs/utils/index.md DELETED
@@ -1,14 +0,0 @@
1
- # utils/ · 训练工具
2
-
3
- 训练与分布式通用工具,被 `trainers/` 复用。
4
-
5
- | 文件 | 内容 | 作用 |
6
- | --- | --- | --- |
7
- | `training.py` | `apply_config` / `lm_checkpoint` / `init_model` / `SkipBatchSampler` / `get_lr` | YAML 配置驱动、checkpoint 读写、采样器 |
8
- | `checkpoint.py` | `save_checkpoint` / `load_checkpoint` / `iter_module_state_dict` | 权重序列化辅助 |
9
- | `distributed.py` | 分布式初始化辅助 | 多卡训练 |
10
- | `multimodal.py` | `init_vlm_model` / `vlm_checkpoint` / `init_omni_model` / `omni_checkpoint` | VLM / VAM 模型装配与 checkpoint |
11
-
12
- 详见:
13
-
14
- - [配置与命令行](config-and-cli.md) — YAML 配置如何驱动训练、`apply_config` 机制、tokenizer 训练、启动示例
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/trainers/lm/agent.py CHANGED
@@ -373,6 +373,7 @@ if __name__ == "__main__":
373
  parser = argparse.ArgumentParser(description="MiniMind Agent RL")
374
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
375
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
376
  parser.add_argument('--save_weight', default='agent', type=str, help="保存权重名称")
377
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
378
  parser.add_argument("--batch_size", type=int, default=2, help="批次大小")
@@ -432,9 +433,9 @@ if __name__ == "__main__":
432
  resume = 'must' if wandb_id else None
433
  wandb.init(project=args.wandb_project, name=f"Agent-RL-E{args.epochs}-B{args.batch_size}-LR{args.learning_rate}", id=wandb_id, resume=resume)
434
 
435
- model, tokenizer = init_model(lm_config, args.from_weight, device=args.device)
436
 
437
- ref_model, _ = init_model(lm_config, args.from_weight, device=args.device)
438
  ref_model = ref_model.eval().requires_grad_(False)
439
 
440
  reward_model = LMForRewardModel(args.reward_model_path, device=args.device, dtype=torch.float16)
 
373
  parser = argparse.ArgumentParser(description="MiniMind Agent RL")
374
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
375
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
376
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
377
  parser.add_argument('--save_weight', default='agent', type=str, help="保存权重名称")
378
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
379
  parser.add_argument("--batch_size", type=int, default=2, help="批次大小")
 
433
  resume = 'must' if wandb_id else None
434
  wandb.init(project=args.wandb_project, name=f"Agent-RL-E{args.epochs}-B{args.batch_size}-LR{args.learning_rate}", id=wandb_id, resume=resume)
435
 
436
+ model, tokenizer = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
437
 
438
+ ref_model, _ = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
439
  ref_model = ref_model.eval().requires_grad_(False)
440
 
441
  reward_model = LMForRewardModel(args.reward_model_path, device=args.device, dtype=torch.float16)
src/trainers/lm/distillation.py CHANGED
@@ -146,6 +146,7 @@ if __name__ == "__main__":
146
  parser = argparse.ArgumentParser(description="MiniMind Knowledge Distillation")
147
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
148
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
149
  parser.add_argument('--save_weight', default='full_dist', type=str, help="保存权重的前缀名")
150
  parser.add_argument("--epochs", type=int, default=6, help="训练轮数")
151
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
@@ -202,9 +203,9 @@ if __name__ == "__main__":
202
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
203
 
204
  # ========== 5. 定义学生和教师模型 ==========
205
- model, tokenizer = init_model(lm_config_student, args.from_student_weight, device=args.device)
206
  Logger(f'学生模型总参数量:{sum(p.numel() for p in model.parameters()) / 1e6:.3f} M')
207
- teacher_model, _ = init_model(lm_config_teacher, args.from_teacher_weight, device=args.device)
208
  teacher_model.eval()
209
  teacher_model.requires_grad_(False)
210
  Logger(f'教师模型总参数量:{sum(p.numel() for p in teacher_model.parameters()) / 1e6:.3f} M')
 
146
  parser = argparse.ArgumentParser(description="MiniMind Knowledge Distillation")
147
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
148
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
149
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
150
  parser.add_argument('--save_weight', default='full_dist', type=str, help="保存权重的前缀名")
151
  parser.add_argument("--epochs", type=int, default=6, help="训练轮数")
152
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
 
203
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
204
 
205
  # ========== 5. 定义学生和教师模型 ==========
206
+ model, tokenizer = init_model(lm_config_student, args.from_student_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
207
  Logger(f'学生模型总参数量:{sum(p.numel() for p in model.parameters()) / 1e6:.3f} M')
208
+ teacher_model, _ = init_model(lm_config_teacher, args.from_teacher_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
209
  teacher_model.eval()
210
  teacher_model.requires_grad_(False)
211
  Logger(f'教师模型总参数量:{sum(p.numel() for p in teacher_model.parameters()) / 1e6:.3f} M')
src/trainers/lm/dpo.py CHANGED
@@ -130,6 +130,7 @@ if __name__ == "__main__":
130
  parser = argparse.ArgumentParser(description="MiniMind DPO (Direct Preference Optimization)")
131
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
132
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
133
  parser.add_argument('--save_weight', default='dpo', type=str, help="保存权重的前缀名")
134
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
135
  parser.add_argument("--batch_size", type=int, default=4, help="batch size")
@@ -180,10 +181,10 @@ if __name__ == "__main__":
180
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
181
 
182
  # ========== 5. 定义模型和参考模型 ==========
183
- model, tokenizer = init_model(lm_config, args.from_weight, device=args.device)
184
  Logger(f'策略模型总参数量:{sum(p.numel() for p in model.parameters()) / 1e6:.3f} M')
185
  # 初始化参考模型(ref_model冻结)
186
- ref_model, _ = init_model(lm_config, args.from_weight, device=args.device)
187
  ref_model.eval()
188
  ref_model.requires_grad_(False)
189
  Logger(f'参考模型总参数量:{sum(p.numel() for p in ref_model.parameters()) / 1e6:.3f} M')
 
130
  parser = argparse.ArgumentParser(description="MiniMind DPO (Direct Preference Optimization)")
131
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
132
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
133
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
134
  parser.add_argument('--save_weight', default='dpo', type=str, help="保存权重的前缀名")
135
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
136
  parser.add_argument("--batch_size", type=int, default=4, help="batch size")
 
181
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
182
 
183
  # ========== 5. 定义模型和参考模型 ==========
184
+ model, tokenizer = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
185
  Logger(f'策略模型总参数量:{sum(p.numel() for p in model.parameters()) / 1e6:.3f} M')
186
  # 初始化参考模型(ref_model冻结)
187
+ ref_model, _ = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
188
  ref_model.eval()
189
  ref_model.requires_grad_(False)
190
  Logger(f'参考模型总参数量:{sum(p.numel() for p in ref_model.parameters()) / 1e6:.3f} M')
src/trainers/lm/full_sft.py CHANGED
@@ -83,6 +83,7 @@ def main(default_config=None):
83
  parser = argparse.ArgumentParser(description="MiniMind Full SFT")
84
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
85
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
86
  parser.add_argument('--save_weight', default='full_sft', type=str, help="保存权重的前缀名")
87
  parser.add_argument("--epochs", type=int, default=2, help="训练轮数")
88
  parser.add_argument("--batch_size", type=int, default=16, help="batch size")
@@ -132,7 +133,7 @@ def main(default_config=None):
132
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
133
 
134
  # ========== 5. 定义模型、数据、优化器 ==========
135
- model, tokenizer = init_model(lm_config, args.from_weight, device=args.device)
136
  train_ds = SFTDataset(args.data_path, tokenizer, max_length=args.max_seq_len)
137
  train_sampler = DistributedSampler(train_ds) if dist.is_initialized() else None
138
  scaler = torch.cuda.amp.GradScaler(enabled=(args.dtype == 'float16'))
 
83
  parser = argparse.ArgumentParser(description="MiniMind Full SFT")
84
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
85
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
86
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
87
  parser.add_argument('--save_weight', default='full_sft', type=str, help="保存权重的前缀名")
88
  parser.add_argument("--epochs", type=int, default=2, help="训练轮数")
89
  parser.add_argument("--batch_size", type=int, default=16, help="batch size")
 
133
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
134
 
135
  # ========== 5. 定义模型、数据、优化器 ==========
136
+ model, tokenizer = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
137
  train_ds = SFTDataset(args.data_path, tokenizer, max_length=args.max_seq_len)
138
  train_sampler = DistributedSampler(train_ds) if dist.is_initialized() else None
139
  scaler = torch.cuda.amp.GradScaler(enabled=(args.dtype == 'float16'))
src/trainers/lm/grpo.py CHANGED
@@ -205,6 +205,7 @@ if __name__ == "__main__":
205
  parser = argparse.ArgumentParser(description="MiniMind GRPO (Group Relative Policy Optimization)")
206
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
207
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
208
  parser.add_argument('--save_weight', default='grpo', type=str, help="保存权重的前缀名")
209
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
210
  parser.add_argument("--batch_size", type=int, default=2, help="batch size")
@@ -271,9 +272,9 @@ if __name__ == "__main__":
271
  # ========== 5. 初始化模型和数据 ==========
272
  base_weight = args.from_weight
273
  # Policy模型
274
- model, tokenizer = init_model(lm_config, base_weight, device=args.device)
275
  # Reference模型
276
- ref_model, _ = init_model(lm_config, base_weight, device=args.device)
277
  ref_model = ref_model.eval().requires_grad_(False)
278
  # Reward模型
279
  reward_model = LMForRewardModel(args.reward_model_path, device=args.device, dtype=torch.float16)
 
205
  parser = argparse.ArgumentParser(description="MiniMind GRPO (Group Relative Policy Optimization)")
206
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
207
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
208
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
209
  parser.add_argument('--save_weight', default='grpo', type=str, help="保存权重的前缀名")
210
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
211
  parser.add_argument("--batch_size", type=int, default=2, help="batch size")
 
272
  # ========== 5. 初始化模型和数据 ==========
273
  base_weight = args.from_weight
274
  # Policy模型
275
+ model, tokenizer = init_model(lm_config, base_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
276
  # Reference模型
277
+ ref_model, _ = init_model(lm_config, base_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
278
  ref_model = ref_model.eval().requires_grad_(False)
279
  # Reward模型
280
  reward_model = LMForRewardModel(args.reward_model_path, device=args.device, dtype=torch.float16)
src/trainers/lm/lora.py CHANGED
@@ -77,6 +77,7 @@ if __name__ == "__main__":
77
  parser = argparse.ArgumentParser(description="MiniMind LoRA Fine-tuning")
78
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
79
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
80
  parser.add_argument("--lora_name", type=str, default="lora_medical", help="LoRA权重名称(如lora_identity/lora_medical等)")
81
  parser.add_argument("--epochs", type=int, default=10, help="训练轮数")
82
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
@@ -126,7 +127,7 @@ if __name__ == "__main__":
126
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
127
 
128
  # ========== 5. 定义模型、应用LoRA、冻结非LoRA参数 ==========
129
- model, tokenizer = init_model(lm_config, args.from_weight, device=args.device)
130
  apply_lora(model)
131
 
132
  # 统计参数
 
77
  parser = argparse.ArgumentParser(description="MiniMind LoRA Fine-tuning")
78
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
79
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
80
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
81
  parser.add_argument("--lora_name", type=str, default="lora_medical", help="LoRA权重名称(如lora_identity/lora_medical等)")
82
  parser.add_argument("--epochs", type=int, default=10, help="训练轮数")
83
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
 
127
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
128
 
129
  # ========== 5. 定义模型、应用LoRA、冻结非LoRA参数 ==========
130
+ model, tokenizer = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
131
  apply_lora(model)
132
 
133
  # 统计参数
src/trainers/lm/ppo.py CHANGED
@@ -295,6 +295,7 @@ if __name__ == "__main__":
295
  parser = argparse.ArgumentParser(description="MiniMind PPO (Proximal Policy Optimization)")
296
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
297
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
298
  parser.add_argument('--save_weight', default='ppo_actor', type=str, help="保存权重的前缀名")
299
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
300
  parser.add_argument("--batch_size", type=int, default=2, help="batch size")
@@ -365,8 +366,8 @@ if __name__ == "__main__":
365
  # ========== 5. 初始化模型和数据 ==========
366
  base_weight = args.from_weight
367
  # Actor模型
368
- actor_model, tokenizer = init_model(lm_config, base_weight, device=args.device)
369
- ref_model, _ = init_model(lm_config, base_weight, device=args.device)
370
  ref_model = ref_model.eval().requires_grad_(False)
371
  moe_suffix = '_moe' if lm_config.use_moe else ''
372
  ckp = f'{args.save_dir}/{base_weight}_{lm_config.hidden_size}{moe_suffix}.pth'
 
295
  parser = argparse.ArgumentParser(description="MiniMind PPO (Proximal Policy Optimization)")
296
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
297
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
298
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
299
  parser.add_argument('--save_weight', default='ppo_actor', type=str, help="保存权重的前缀名")
300
  parser.add_argument("--epochs", type=int, default=1, help="训练轮数")
301
  parser.add_argument("--batch_size", type=int, default=2, help="batch size")
 
366
  # ========== 5. 初始化模型和数据 ==========
367
  base_weight = args.from_weight
368
  # Actor模型
369
+ actor_model, tokenizer = init_model(lm_config, base_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
370
+ ref_model, _ = init_model(lm_config, base_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
371
  ref_model = ref_model.eval().requires_grad_(False)
372
  moe_suffix = '_moe' if lm_config.use_moe else ''
373
  ckp = f'{args.save_dir}/{base_weight}_{lm_config.hidden_size}{moe_suffix}.pth'
src/trainers/lm/pretrain.py CHANGED
@@ -82,6 +82,7 @@ if __name__ == "__main__":
82
  parser = argparse.ArgumentParser(description="MiniMind Pretraining")
83
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
84
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
 
85
  parser.add_argument('--save_weight', default='pretrain', type=str, help="保存权重的前缀名")
86
  parser.add_argument("--epochs", type=int, default=2, help="训练轮数")
87
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
@@ -131,7 +132,7 @@ if __name__ == "__main__":
131
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
132
 
133
  # ========== 5. 定义模型、数据、优化器 ==========
134
- model, tokenizer = init_model(lm_config, args.from_weight, device=args.device)
135
  train_ds = PretrainDataset(args.data_path, tokenizer, max_length=args.max_seq_len)
136
  train_sampler = DistributedSampler(train_ds) if dist.is_initialized() else None
137
  scaler = torch.cuda.amp.GradScaler(enabled=(args.dtype == 'float16'))
 
82
  parser = argparse.ArgumentParser(description="MiniMind Pretraining")
83
  parser.add_argument('--config', type=str, default=None, help='YAML 配置路径,其字段作为 argparse 默认值,CLI 显式传参可覆盖')
84
  parser.add_argument("--save_dir", type=str, default="../checkpoint", help="模型保存目录")
85
+ parser.add_argument("--tokenizer_dir", type=str, default="checkpoint/tokenizer", help="tokenizer 目录路径")
86
  parser.add_argument('--save_weight', default='pretrain', type=str, help="保存权重的前缀名")
87
  parser.add_argument("--epochs", type=int, default=2, help="训练轮数")
88
  parser.add_argument("--batch_size", type=int, default=32, help="batch size")
 
132
  wandb.init(project=args.wandb_project, name=wandb_run_name, id=wandb_id, resume=resume)
133
 
134
  # ========== 5. 定义模型、数据、优化器 ==========
135
+ model, tokenizer = init_model(lm_config, args.from_weight, save_dir=args.save_dir, tokenizer_dir=args.tokenizer_dir, device=args.device)
136
  train_ds = PretrainDataset(args.data_path, tokenizer, max_length=args.max_seq_len)
137
  train_sampler = DistributedSampler(train_ds) if dist.is_initialized() else None
138
  scaler = torch.cuda.amp.GradScaler(enabled=(args.dtype == 'float16'))
src/utils/training.py CHANGED
@@ -158,8 +158,9 @@ def lm_checkpoint(lm_config, weight='full_sft', model=None, optimizer=None, epoc
158
  return None
159
 
160
 
161
- def init_model(lm_config, from_weight='pretrain', tokenizer_path='../model', save_dir='../checkpoint', device='cuda'):
162
- tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
 
163
  model = LMForCausalLM(lm_config)
164
 
165
  if from_weight != 'none':
 
158
  return None
159
 
160
 
161
+ def init_model(lm_config, from_weight='pretrain', save_dir='../checkpoint', tokenizer_dir=None, device='cuda'):
162
+ tokenizer_dir = tokenizer_dir or os.path.join(save_dir, 'tokenizer')
163
+ tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir)
164
  model = LMForCausalLM(lm_config)
165
 
166
  if from_weight != 'none':
uv.lock CHANGED
The diff for this file is too large to render. See raw diff