cleanup: remove deprecated doc files, update src training utils
Browse files- .gitignore +6 -6
- docs/dataset/index.md +0 -33
- docs/encoders/index.md +0 -14
- docs/overview.md +0 -108
- docs/projectors/index.md +0 -21
- docs/trainers/index.md +0 -13
- docs/trainers/trainers.md +0 -50
- docs/utils/config-and-cli.md +0 -83
- docs/utils/index.md +0 -14
- src/trainers/lm/agent.py +3 -2
- src/trainers/lm/distillation.py +3 -2
- src/trainers/lm/dpo.py +3 -2
- src/trainers/lm/full_sft.py +2 -1
- src/trainers/lm/grpo.py +3 -2
- src/trainers/lm/lora.py +2 -1
- src/trainers/lm/ppo.py +3 -2
- src/trainers/lm/pretrain.py +2 -1
- src/utils/training.py +3 -2
- uv.lock +0 -0
.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',
|
| 162 |
-
|
|
|
|
| 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
|
|
|