一、架构
train.Config├── model_name which model to fine-tune├── dataset_builder SupervisedDatasetBuilder → SupervisedDataset├── learning_rate optimizer config (+ lr_schedule, adam_*)├── evaluator_builders what to measure during training├── save_every / eval_every checkpoint and eval cadence└── lora_rank LoRA adapter sizeSupervisedDatasetBuilder└── __call__() → (train_dataset, eval_dataset) │ ▼SupervisedDataset├── get_batch(index) → list[tinker.Datum]├── __len__() → number of batches└── set_epoch(seed) → shuffle for next epoch
二、tinker_cookbook.supervised.train.Config
核心配置。定义模型、数据、超参数和评测。
from tinker_cookbook.supervised import trainconfig = train.Config( log_path="~/logs/my-sft-run", model_name="Qwen/Qwen3-8B", dataset_builder=my_dataset_builder, learning_rate=1e-4, lora_rank=32, num_epochs=1, save_every=20, eval_every=10,)asyncio.run(train.main(config))
三、SupervisedDataset / SupervisedDatasetBuilder
SupervisedDatasetBuilder 是一个用于构造 SupervisedDataset 的配置。数据集返回成批的 tinker.Datum 对象。
from tinker_cookbook.supervised.types import SupervisedDatasetBuilder, SupervisedDatasetclass MyDatasetBuilder(SupervisedDatasetBuilder): def __call__(self) -> tuple[SupervisedDataset, SupervisedDataset | None]: return train_data, eval_data # eval_data is optional
内置构建器:
| 构建器 | 用途 |
| SupervisedDatasetFromHFDataset | 用 map_fn 或 flatmap_fn 包装一个 HuggingFace 数据集 |
| StreamingSupervisedDatasetFromHFDataset | 从 HuggingFace 流式加载(内存占用更低) |
| FromConversationFileBuilder | 从聊天对话的 JSONL 文件加载 |
| ChatDatasetBuilder | 聊天数据的基类——额外提供 tokenizer + renderer |
四、ChatDatasetBuilder
用于聊天格式的数据。通过 ChatDatasetBuilderCommonConfig 提供 tokenizer 和 renderer 属性:
from tinker_cookbook.supervised.types import ChatDatasetBuilder, ChatDatasetBuilderCommonConfigclass MyChats(ChatDatasetBuilder): common_config = ChatDatasetBuilderCommonConfig( model_name_for_tokenizer="Qwen/Qwen3-8B", renderer_name="qwen3", batch_size=8, max_length=4096, )
五、训练循环
train.main(config) 负责整个流水线:
1. 创建 ServiceClient → TrainingClient
2. 从 config.dataset_builder 构建数据集
3. 对每个 epoch 和每个批次:
·用该批次执行 forward_backward
·执行 optim_step
·每隔 eval_every 运行一次评测器
·每隔 save_every 保存一次检查点
4. 保存最终检查点
这个循环会对请求做流水线处理以提升吞吐,详情请参见 时钟周期与流水线。
六、下一步
·sl_loop.py:不带抽象层的最小训练循环
·SL 超参数: 如何选择学习率、rank 和批大小
·教程:你的第一个 SFT:交互式演练