# 第 2 课:环境、依赖、数据与权重 ## 目录 - [1. 本节目标](#l02-goals) - [2. 四类运行条件](#l02-runtime-requirements) - [3. 目录约定](#l02-directory-conventions) - [4. 哪些命令依赖什么资源](#l02-command-resources) - [5. 本节最小实验](#l02-experiment) - [6. 如何判断“现在能不能跑”](#l02-readiness) - [7. 常见坑](#l02-pitfalls) - [8. 课后任务](#l02-homework) - [9. 检查题](#l02-check) - [10. 下一课预告](#l02-next) ## 1. 本节目标 学完本节,你应该能回答: - 这个项目运行时依赖哪些资源:源码、Python 包、数据、权重。 - 为什么刚 clone 下来的仓库通常不能直接训练或推理。 - `dataset/`、`out/`、`checkpoints/`、transformers 模型目录分别放什么。 - 如何判断一个命令现在能不能跑。 本节不要求理解模型结构、loss、SFT labels,这些后面单独讲。 ## 2. 四类运行条件 MiniMind 要跑起来,通常需要四类东西。 | 类型 | 例子 | 用途 | |---|---|---| | 源码 | `model/`, `dataset/`, `trainer/`, `scripts/` | 定义模型、数据集、训练和推理逻辑 | | Python 包 | `torch`, `transformers`, `datasets` | 执行模型、分词、数据加载 | | 训练数据 | `pretrain_t2t_mini.jsonl`, `sft_t2t_mini.jsonl` | 训练时读取 | | 模型权重 | `out/full_sft_768.pth` 或 `minimind-3/` | 推理或继续训练时加载 | 源码仓库只保证第一类资源存在。数据和权重通常要单独下载。 ## 3. 目录约定 MiniMind 的常见目录含义如下。 ```text /home/sun/minimind/ ├── model/ # tokenizer 和 MiniMind 模型源码 ├── dataset/ # 训练数据应该放这里 ├── trainer/ # 训练脚本 ├── scripts/ # API、WebUI、模型转换等脚本 ├── out/ # 训练得到的普通 pth 权重,当前可能不存在 ├── checkpoints/ # 断点续训 checkpoint,当前可能不存在 ├── minimind-3/ # transformers 格式模型目录,需单独下载 └── course/ # 本课程材料 ``` 三个目录最容易混: - `model/`:当前仓库自带,主要是源码和 tokenizer,不等于已训练模型权重。 - `out/`:放 `pretrain_768.pth`、`full_sft_768.pth` 这类 PyTorch 权重。 - `minimind-3/`:放 Hugging Face / ModelScope 下载的 transformers 格式模型。 ## 4. 哪些命令依赖什么资源 ### 4.1 只读检查 这些命令通常只需要源码和已安装的基础包: ```bash cd /home/sun/minimind PYTHONDONTWRITEBYTECODE=1 python course/labs/check_minimind_import.py PYTHONDONTWRITEBYTECODE=1 python course/labs/check_project_readiness.py ``` ### 4.2 默认预训练 ```bash cd /home/sun/minimind/trainer python train_pretrain.py ``` 默认会找: ```text ../dataset/pretrain_t2t_mini.jsonl ``` 如果这个文件不存在,会在加载数据阶段失败。 ### 4.3 默认 SFT ```bash cd /home/sun/minimind/trainer python train_full_sft.py ``` 默认会找: ```text ../out/pretrain_768.pth ../dataset/sft_t2t_mini.jsonl ``` 也就是说,默认 SFT 假设你已经有预训练权重。 ### 4.4 默认 CLI 推理 ```bash cd /home/sun/minimind python eval_llm.py ``` 默认参数相当于: ```bash python eval_llm.py --load_from model --weight full_sft --save_dir out ``` 默认会使用仓库里的 tokenizer,但还会找: ```text ./out/full_sft_768.pth ``` 如果本地没有这个权重,默认推理不能跑。 ### 4.5 transformers 格式推理 ```bash cd /home/sun/minimind python eval_llm.py --load_from ./minimind-3 ``` 这种方式要求 `./minimind-3` 是完整的 transformers 模型目录,里面通常有: ```text config.json tokenizer.json tokenizer_config.json model.safetensors 或 pytorch_model.bin ``` ## 5. 本节最小实验 运行项目 readiness 检查: ```bash cd /home/sun/minimind PYTHONDONTWRITEBYTECODE=1 python course/labs/check_project_readiness.py ``` 它会检查: - Python 版本。 - 关键包是否能导入。 - CUDA 是否可用。 - 默认数据文件是否存在。 - 默认 PyTorch 权重是否存在。 - transformers 模型目录是否存在。 - WebUI 和训练记录相关的可选依赖是否存在。 这个脚本不会下载任何东西,也不会开始训练。 ## 6. 如何判断“现在能不能跑” 用下面这个规则即可。 ```text 只读源码实验:需要源码 + 基础依赖 默认 pretrain:需要 pretrain jsonl 默认 SFT:需要 pretrain pth + SFT jsonl 默认 eval:需要 full_sft pth transformers eval:需要完整 transformers 模型目录 WebUI:还需要 streamlit --use_wandb:还需要 swanlab ``` 如果缺资源,不要先改代码。先确认是缺数据、缺权重,还是缺 Python 包。 ## 7. 常见坑 - `model/` 目录不是已训练模型目录,它主要是源码和 tokenizer。 - `checkpoints/` 是断点续训用的,不等同于最终推理权重。 - `out/` 是训练输出目录,刚 clone 下来一般没有。 - `python eval_llm.py --load_from ./model` 会走原生 PyTorch 权重加载。 - `python eval_llm.py --load_from ./minimind-3` 会走 transformers 模型加载。 - 当前课程前期使用 tiny 数据,不急着下载 GB 级训练集。 ## 8. 课后任务 1. 运行 `check_project_readiness.py`,记录哪些是 `OK`,哪些是 `MISSING` 或 `OPTIONAL-MISSING`。 2. 找出 `train_pretrain.py` 默认的数据路径。 3. 找出 `train_full_sft.py` 默认的 `from_weight` 是什么。 4. 用一句话解释 `out/` 和 `checkpoints/` 的区别。 ## 9. 检查题 1. 为什么源码仓库存在,不代表默认训练能跑? 2. 默认 pretrain 需要哪个数据文件? 3. 默认 SFT 至少需要哪两个资源? 4. 默认 `eval_llm.py` 会尝试加载哪个权重文件? 5. 如果想用下载好的 transformers 模型推理,应该使用哪个参数? ## 10. 下一课预告 第 3 课会讲 CLI 推理流程。我们会只看推理调用链:用户输入如何变成 prompt,prompt 如何变成 token,模型如何生成,再如何 decode 回文本。