Cookbook 提供了一个流水线式的 Supervised Learning(SFT,监督学习)训练循环,数据集、评测和检查点保存都可配置。
架构
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 → TrainingClient2. 从
config.dataset_builder 构建数据集3. 对每个 epoch 和每个批次:
用该批次执行
forward_backward执行
optim_step每隔
eval_every 运行一次评测器每隔
save_every 保存一次检查点4. 保存最终检查点
下一步
sl_loop.py:不带抽象层的最小训练循环
SL 超参数: 如何选择学习率、rank 和批大小
教程:你的第一个 SFT:交互式演练