SaddleLLM
当前版本:2.33
SaddleLLM 是一个以配置驱动的模型训练与运行工具箱。用户准备数据、模型和一份训练配置,系统负责检查输入、安排训练阶段、调用对应训练器,并保存 checkpoint、评测结果和运行状态。
本文只讲当前实现,按三个问题展开:
- 这个系统是什么。
- 怎么使用,命令会返回什么。
- 代码和训练过程为什么这样运行。
1. 这个系统是什么
1.1 系统定位
SaddleLLM 不是一个单独的模型,也不是重新实现 PyTorch、Transformers、PEFT 或 TRL。它位于这些训练库的上层,把一次模型实验需要的内容组织起来:
数据 + 基础模型 + 训练参数 + 执行阶段
↓
SaddleLLM
↓
训练计划 + checkpoint + 评测 + 发布文件 + 运行记录
它主要解决五件事:
- 用一份 YAML/JSON 明确本次运行要做哪些阶段。
- 在加载大模型前检查配置、数据和运行环境。
- 按顺序调用预训练、SFT、偏好训练、评测和导出等实现。
- 把前一个阶段产生的模型或数据交给后一个阶段。
- 保存计划、状态和结果,让失败可定位、运行可恢复、产物可追踪。
1.2 输入、处理和输出
| 类型 | 具体内容 |
|---|---|
| 输入 | YAML/JSON 配置、文本或多模态数据、基础模型或 checkpoint |
| 处理 | 数据检查、模型加载、阶段排序、训练、评测、导出 |
| 输出 | 阶段计划、训练 checkpoint、最终模型、指标、发布门禁、运行摘要 |
用于 train、validate-config 和 plan 的训练配置只有一种结构:顶层必须有非空的 stages 列表。
例如:
stages: [sft, preference, eval]
这表示依次执行:
监督微调 → 偏好训练 → 评测
每个阶段的参数放在同名配置块里:
stages: [sft, preference]
sft:
enabled: true
data_path: data/sft.jsonl
preference:
enabled: true
method: dpo
data_path: data/preference.jsonl
1.3 当前支持的能力
| 领域 | 阶段或入口 | 当前实际行为 |
|---|---|---|
| Tokenizer | tokenizer |
训练新 tokenizer;未提供训练参数时加载已有 tokenizer |
| 从零预训练 | pretrain + pretrain_mode: scratch |
创建模型、处理语料、执行 causal LM 训练并保存最终模型 |
| 继续预训练 | pretrain + pretrain_mode: continue |
加载已有权重,用新训练任务继续优化 |
| 监督微调 | sft |
执行全参数、LoRA 或 QLoRA SFT |
| 偏好训练 | preference |
执行 DPO、ORPO 或 KTO |
| RLHF | rlhf |
DPO 可执行;PPO 目前只返回未接入状态 |
| 多教师蒸馏 | mopd |
生成计划,或调用教师收集 on-policy 数据供后续 SFT |
| VLA | vla_sft |
检查并规范化机器人轨迹;vla.train: true 时执行行为克隆训练 |
| 通用图文训练 | mllm_sft、vision_alignment |
当前负责数据规范化和训练计划,还没有执行通用 VLM 参数优化 |
| 图像生成 | media_cache + image_generation |
编码图像与文本条件,训练潜变量生成模型 |
| 音乐生成 | media_cache + music_generation |
编码音频码本与文本条件,训练多码本自回归模型 |
| 视频生成 | media_cache + video_generation |
编码视频潜变量与文本条件,训练时空生成模型 |
| 世界模型 | world_model |
用离线轨迹训练 RSSM 或 categorical RSSM |
| 眼动控制 | eye_control |
在安全软件仿真器中评估 PID 或世界模型规划控制 |
| 评测 | eval |
计算指标,并可按规则生成发布门禁结果 |
| 导出 | export |
打包 HF 或 Saddle 模型;可要求评测门禁先通过 |
| 外部算子 | operator |
调用已配置的 agent/大模型算子并登记产物 |
1.4 两种模型后端
model.backend 决定文本模型由哪套实现负责:
| 后端 | 用途 | 当前边界 |
|---|---|---|
hf |
Hugging Face 模型加载、SFT、LoRA、QLoRA、DPO、ORPO、KTO | 最适合已有开源模型的后训练 |
saddle |
项目原生模块化语言模型、原生 checkpoint、预训练和 DPO | 不支持 LoRA/QLoRA;偏好方法当前只支持 DPO |
非单进程的 DDP、FSDP 和 DeepSpeed 路径,目前只对 model.backend: saddle 的 pretrain 阶段声明为可执行。其他内置阶段使用 distributed.strategy: single。
1.5 代码目录
| 路径 | 作用 |
|---|---|
saddlellm/cli.py |
命令行参数和命令分发 |
saddlellm/training/TrainingOrchestrator.py |
解析配置、校验并执行阶段 |
saddlellm/framework/stages.py |
阶段注册表和阶段能力声明 |
saddlellm/training/ |
预训练、SFT、偏好训练和分布式运行 |
saddlellm/data/ |
数据采集、清洗、规范化和检查 |
saddlellm/models/ |
模型结构、构建、加载和 tokenizer |
saddlellm/multimodal/ |
图像、音频、视频、VLM 和 VLA |
saddlellm/world_models/ |
RSSM 数据、模型、训练和推理 |
saddlellm/spatial/ |
空间感知、路径规划、眼动控制和 WorldAgent |
saddlellm/evaluation/ |
评测、冒烟测试和发布门禁 |
saddlellm/runtime/ |
模型导出、服务和部署 |
configs/ |
可以直接参考的配置文件 |
tests/ |
行为和接口测试 |
2. 怎么使用、命令做什么、返回什么
2.1 安装
建议使用独立虚拟环境:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e ".[posttrain,dev]"
按功能安装可选依赖:
| 需求 | 安装命令 |
|---|---|
| 通用训练 | python -m pip install -e ".[train]" |
| SFT、PEFT、TRL | python -m pip install -e ".[posttrain]" |
| QLoRA | python -m pip install -e ".[posttrain,qlora]" |
| 推理 API | python -m pip install -e ".[serve]" |
| 空间智能与眼动控制 | python -m pip install -e ".[spatial]" |
| 开发和测试 | python -m pip install -e ".[dev]" |
如果要严格使用仓库验证过的后训练版本:
python -m pip install -r requirements-posttrain.txt
安装完成后确认命令可见:
saddle-llm --help
也可以不用 console script:
python -m saddlellm.cli --help
2.2 第一次运行
创建一个 10 步 LoRA SFT 小项目:
saddle-llm quickstart ".\my-training"
生成的目录:
my-training/
├─ config.yaml
├─ README.md
└─ data/
└─ sft.jsonl
命令返回 JSON,主要字段如下:
{
"workspace": "绝对路径/my-training",
"config": "绝对路径/my-training/config.yaml",
"stages": ["sft"],
"model": "Qwen/Qwen2.5-0.5B-Instruct",
"data_files": {"sft": "绝对路径/my-training/data/sft.jsonl"},
"created_files": ["..."],
"next_steps": ["..."],
"note": "..."
}
进入目录后依次执行:
Set-Location ".\my-training"
saddle-llm doctor
saddle-llm inspect-data data/sft.jsonl --task sft
saddle-llm validate-config config.yaml
saddle-llm train config.yaml --dry-run
saddle-llm train config.yaml
创建“SFT 后接 DPO”的项目:
saddle-llm quickstart ".\my-training" --stages sft,preference --preference-method dpo
使用自己的数据和模型:
saddle-llm quickstart ".\my-training" --model "D:\models\my-model" --data "D:\datasets\sft.jsonl"
quickstart 不会下载模型,也不会开始训练。它只创建配置、示例数据和下一步命令。目标文件已存在时默认拒绝覆盖;--force 只覆盖它负责生成的文件。
2.3 训练配置怎么写
一个可直接运行的 SFT 配置:
project: saddlellm
experiment: my-sft
stages: [sft]
model:
name_or_path: Qwen/Qwen2.5-0.5B-Instruct
tokenizer: Qwen/Qwen2.5-0.5B-Instruct
backend: hf
sft:
enabled: true
data_path: data/sft.jsonl
use_lora: true
use_qlora: false
epochs: 1
learning_rate: 0.0002
per_device_batch_size: 1
gradient_accumulation_steps: 4
max_seq_length: 1024
warmup_steps: 0
save_steps: 50
training:
max_steps: 100
distributed:
strategy: single
num_gpus: 1
bf16: false
fp16: false
logging:
output_dir: outputs/my-sft
backend: local
顶层字段的职责:
| 字段 | 作用 |
|---|---|
project |
项目名,用于记录 |
experiment |
本次实验名 |
stages |
要执行的阶段;必须是非空、无重复的字符串列表 |
model |
模型路径、tokenizer 和后端 |
data |
预训练使用的数据源和清洗参数 |
training |
全局步数、预训练超参数、checkpoint、恢复和 dry-run 设置 |
distributed |
单机或分布式策略、GPU 数和精度 |
logging |
总输出目录和日志后端 |
pipeline |
可选的依赖关系和阶段级恢复设置 |
| 与阶段同名的块 | 该阶段自己的数据、方法和超参数 |
推荐显式写出阶段开关:
stages: [sft, preference, eval]
sft:
enabled: true
preference:
enabled: true
method: dpo
eval:
enabled: true
stages 决定系统是否调度该阶段;对带 enabled 开关的阶段,该开关决定收到调度后是否工作。最不容易出错的写法是:把 sft、preference、eval 等列入 stages 时,其配置块同时写 enabled: true。
文本后训练方法:
| 方式 | 配置 |
|---|---|
| 全参数训练 | use_lora: false,use_qlora: false |
| LoRA | use_lora: true,use_qlora: false |
| QLoRA | use_lora: true,use_qlora: true |
training.max_steps 的含义:
- 大于 0:最多运行指定步数。
- 等于
-1:由阶段自己的epochs决定训练长度。 - 等于 0 或小于
-1:配置无效。
对于 train 使用的训练配置,相对路径按运行命令时的当前目录解释。为了避免路径错误,建议在仓库根目录运行仓库内的示例,或在 quickstart 目录内运行生成的配置。
2.4 推荐的使用顺序
第一步:检查环境
saddle-llm doctor
检查 Python、PyTorch、Transformers、Datasets、Accelerate、PEFT、TRL、CUDA、GPU、内存和磁盘。
主要返回:
{
"ready": true,
"python_version": "...",
"cuda_available": true,
"gpu_count": 1,
"gpu_memory_gb": 20.0,
"packages": {},
"issues": [],
"recommendations": []
}
ready: false 时看 issues。没有 GPU 会被标记为问题,但极小的 CPU 测试仍可能运行。
第二步:检查数据
SFT:
saddle-llm inspect-data data/sft.jsonl --task sft
DPO/ORPO:
saddle-llm inspect-data data/preference.jsonl --task dpo
KTO:
saddle-llm inspect-data data/kto.jsonl --task kto
返回 ready、样本数、字段格式、文本长度、重复样本和阻断问题。数据不合格时退出码为 1。
第三步:检查配置
saddle-llm validate-config config.yaml
返回:
{
"valid": true,
"stages": ["sft"],
"issues": [],
"warnings": [],
"data_inspections": {},
"training_estimates": {},
"normalized_config": {},
"config_path": "config.yaml"
}
它会检查阶段名、必填数据、模型后端、训练步数、精度冲突、分布式能力、动作空间和发布门禁等。只检查结构、不打开本地数据时使用:
saddle-llm validate-config config.yaml --skip-data-inspection
第四步:查看执行顺序
saddle-llm train config.yaml --dry-run
返回 stages、pipeline_plan、distributed 和数据源数量。这个参数不会加载模型或训练,只展示调度顺序;完整数据检查仍应使用 validate-config。
第五步:正式训练
saddle-llm train config.yaml
成功时返回:
{
"ok": true,
"command": "train",
"config": "config.yaml",
"results": {
"sft": {
"status": "completed",
"model_path": "outputs/my-sft/sft_checkpoints"
}
}
}
失败时返回 ok: false、异常类型和错误信息,并以退出码 1 结束。需要完整 Python 堆栈时:
saddle-llm train config.yaml --debug
2.5 基础命令
| 命令 | 做什么 | 最小用法 | 主要结果 |
|---|---|---|---|
quickstart |
创建入门训练目录 | saddle-llm quickstart .\demo |
config.yaml、样例数据、下一步命令 |
doctor |
检查环境和依赖 | saddle-llm doctor |
ready、硬件、依赖、问题和建议 |
inspect-data |
检查 SFT/偏好/RL 数据 | saddle-llm inspect-data data.jsonl --task sft |
数据质量报告 |
inspect-vla |
检查 VLA 轨迹、图像和动作维度 | saddle-llm inspect-vla robot.jsonl --image-root images |
VLA 数据报告 |
validate-config |
静态校验训练配置 | saddle-llm validate-config config.yaml |
valid、问题、警告和训练量估算 |
train |
执行训练配置 | saddle-llm train config.yaml |
各阶段结果和输出路径 |
plan |
生成启动命令,不训练 | saddle-llm plan config.yaml |
launch_plan.json 和 launch.ps1 |
preflight |
针对一个后训练任务检查数据并生成计划 | saddle-llm preflight data.jsonl --stage sft |
preflight_plan.json、config.json、阻断项和估算 |
plugins |
列出内置和已安装的阶段 | saddle-llm plugins |
阶段名称、来源和加载状态 |
smoke-test |
用本地 tiny 模型检查训练主链 | saddle-llm smoke-test --in-process |
SFT、VLA、DPO、ORPO、KTO 等测试结果 |
import-data |
导入数据 manifest | saddle-llm import-data dataset_info.json |
保存位置、数据摘要和导入数量 |
plan 根据 distributed.strategy 生成启动文件。它不执行训练:
saddle-llm plan configs/sft_lora.yaml
.\configs\launch.ps1
preflight 一次只检查一个后训练任务,所以参数使用单数 --stage。真正的训练配置仍使用复数 stages:
saddle-llm preflight data/posttrain_sft_example.jsonl --stage sft --root-dir .\llm_factory
2.6 媒体和生成命令
这些命令用于单独执行某个工具;它们的参数文件只是该命令的输入,不是 train 使用的训练配置。
| 命令 | 做什么 | 最小用法 | 主要结果 |
|---|---|---|---|
media-codecs |
查看已注册的图像、音频或视频编码器 | saddle-llm media-codecs --modality image |
Codec 名称、模态和能力 |
build-media-cache |
把原始媒体清单编码成可恢复分片 | saddle-llm build-media-cache configs/media_cache_image.yaml |
cache manifest、分片路径和样本统计 |
同样的媒体处理也可以放入主训练配置:
stages: [media_cache, image_generation]
完整示例见 raw_image_to_training.yaml。
2.7 世界模型和眼动控制命令
| 命令 | 做什么 | 最小用法 | 主要结果 |
|---|---|---|---|
world-model-backends |
查看 RSSM 后端 | saddle-llm world-model-backends |
可用后端及能力 |
train-world-model |
单独训练世界模型 | saddle-llm train-world-model configs/world_model.yaml --dry-run |
推断出的维度、训练计划;去掉 --dry-run 后返回 checkpoint 信息 |
infer-world-model |
从 checkpoint 做 rollout 或动作规划 | saddle-llm infer-world-model CHECKPOINT request.json |
预测轨迹、奖励或候选动作 |
build-eye-control-data |
生成安全过滤后的双轴眼动轨迹 | saddle-llm build-eye-control-data --episodes 128 |
JSONL 数据路径和生成统计 |
simulate-eye-control |
在软件仿真器评估 PID 或 RSSM+CEM | saddle-llm simulate-eye-control --config configs/prosthetic_eye_runtime.yaml |
跟踪误差、安全事件和控制统计 |
世界模型也能作为主训练阶段运行:
saddle-llm train configs/world_model_stage.yaml
世界模型训练后立即做眼动控制评估:
saddle-llm train configs/prosthetic_eye_control.yaml
2.8 空间智能和 WorldAgent 命令
| 命令 | 做什么 | 最小用法 | 主要结果 |
|---|---|---|---|
build-spatial-world-data |
从俯视图生成空间世界模型轨迹 | saddle-llm build-spatial-world-data map.png --output data/spatial.jsonl |
轨迹数据和生成统计 |
evaluate-spatial-world-model |
评估多步占用、运动和碰撞预测 | saddle-llm evaluate-spatial-world-model CHECKPOINT data.jsonl |
分项评测指标 |
plan-spatial-route |
从地图提取占用网格并规划 Top-K 路线 | saddle-llm plan-spatial-route map.png --start 10,20 --goal 300,200 |
路线 JSON、HTML 和 PNG |
spatial-studio |
启动可视化空间工作台 | saddle-llm spatial-studio |
前台 HTTP 服务,默认端口 7865 |
world-agent-run |
一次执行分析、规划和仿真 | saddle-llm world-agent-run map.png --start 10,20 --goal 300,200 |
状态、候选路线、仿真和产物路径 |
world-agent-api |
启动无界面的 WorldAgent API | saddle-llm world-agent-api |
前台 HTTP 服务,默认端口 7866 |
spatial-studio、world-agent-api 和 serve-model 是持续运行的服务命令,不会像普通命令一样立即返回。按 Ctrl+C 停止。
2.9 评测、发布和服务命令
| 命令 | 做什么 | 最小用法 | 主要结果 |
|---|---|---|---|
report |
汇总一个训练输出目录 | saddle-llm report outputs/my-run |
预训练/运行报告 |
export-model |
把 checkpoint 或 adapter 打包成可验证发布目录 | saddle-llm export-model CHECKPOINT outputs/release |
模型文件、manifest、可选权重哈希和门禁信息 |
serve-model |
启动 OpenAI 兼容推理 API | saddle-llm serve-model outputs/release |
/v1/models、/v1/chat/completions、/v1/completions |
要求发布门禁通过后才导出:
saddle-llm export-model CHECKPOINT outputs/release --gate-result outputs/run/release_gate.json --require-gate
启动本地推理服务:
saddle-llm serve-model outputs/release --host 127.0.0.1 --port 8000
如果需要 Bearer Token,不要把密钥直接写进命令:
$env:SADDLE_API_KEY = "your-secret"
saddle-llm serve-model outputs/release --api-key-env SADDLE_API_KEY
2.10 Python 调用
直接运行配置:
from saddlellm.training.TrainingOrchestrator import TrainingOrchestrator
runner = TrainingOrchestrator.from_yaml("config.yaml")
results = runner.run()
print(results)
从字典运行:
from saddlellm.training.TrainingOrchestrator import TrainingOrchestrator
config = {
"stages": ["sft"],
"model": {
"backend": "hf",
"name_or_path": "Qwen/Qwen2.5-0.5B-Instruct",
},
"sft": {
"enabled": True,
"data_path": "data/sft.jsonl",
"use_lora": True,
"use_qlora": False,
},
"training": {"max_steps": 10},
"distributed": {"strategy": "single", "bf16": False},
"logging": {"output_dir": "outputs/python-run"},
}
results = TrainingOrchestrator.from_dict(config).run()
只做静态校验:
import yaml
from saddlellm.training.TrainingConfigValidator import TrainingConfigValidator
with open("config.yaml", encoding="utf-8") as handle:
config = yaml.safe_load(handle)
report = TrainingConfigValidator.validate(config)
print(report.to_dict())
2.11 返回状态和输出目录
阶段结果中的常见 status:
| 状态 | 含义 |
|---|---|
completed、trained |
已实际执行成功 |
planned |
只生成计划,没有训练 |
planned_no_data |
缺少数据,只保存计划 |
planned_unsupported |
已识别,但真实执行尚未接入 |
skipped |
阶段被关闭 |
rejected |
评测门禁未通过 |
blocked |
因上游条件不满足而阻止执行 |
failed |
执行失败 |
典型输出目录:
outputs/my-run/
├─ plans/
│ ├─ sft_plan.json
│ ├─ preference_plan.json
│ └─ export_plan.json
├─ sft_checkpoints/
├─ preference_checkpoints/
├─ final_model/
├─ release/
├─ pipeline_state.json
├─ release_gate.json
├─ summary.json
└─ training_summary.json
不同 stages 只生成与自己有关的目录。summary.json 和 training_summary.json 记录执行顺序、耗时、各阶段结果和产物。
3. 原理、代码逻辑和训练过程
3.1 一条命令进入系统后发生什么
执行:
saddle-llm train config.yaml
内部顺序:
cli.py
1. 读取 YAML/JSON
2. 检查顶层 stages 是非空、无重复的字符串列表
↓
TrainingOrchestrator._parse_config()
3. 把 model、training、distributed 和各阶段参数解析成配置对象
↓
StageRegistry
4. 确认每个阶段有对应实现,并读取它的能力限制
↓
PipelinePlan
5. 确定执行顺序和依赖关系
↓
TrainingOrchestrator._validate_config()
6. 在模型加载前检查数据、后端、精度、分布式和阶段组合
↓
TrainingOrchestrator.run()
7. 逐个执行阶段,保存状态和产物
↓
summary.json + 命令行 JSON
CLI 只负责读取参数和展示结果。真正的训练入口位于 TrainingOrchestrator,具体数学计算由各 Trainer 完成。
3.2 阶段如何排序
默认按 stages 的书写顺序执行:
stages: [sft, preference, eval, export]
顺序就是:
sft → preference → eval → export
存在独立分支时可以显式声明依赖:
stages: [sft, world_model, preference, eval, export]
pipeline:
dependencies:
sft: []
world_model: []
preference: [sft]
eval: [preference, world_model]
export: [eval]
此时 sft 与 world_model 没有相互依赖;eval 必须等待两条分支完成。系统会检查不存在的依赖、重复阶段和依赖环。
简单任务不需要写 pipeline.dependencies。
3.3 阶段之间怎样交接
文本模型主链:
model.name_or_path
│
├───────────────┐
▼ │
pretrain │
│ model_path │
▼ │
sft ◄────────────┘
│ model_path
▼
preference / rlhf
│ model_path
▼
eval
│ metrics + release_gate
▼
export
后一个阶段优先使用前一个阶段返回的 model_path。没有上游模型时,才使用 model.name_or_path。
数据产物也可以交接:
mopd 产生 on-policy JSONL → sft.data_path 为空时由 SFT 使用
media_cache 产生编码分片 → image/music/video generation 使用
world_model 产生 checkpoint → eye_control 使用
每个阶段返回一个普通字典。系统把结果保存在阶段结果表中,同时登记可追踪产物。
3.4 预训练逻辑
pretrain 有三种启动方式:
| 方式 | 关键配置 | 含义 |
|---|---|---|
| 从零训练 | pretrain_mode: scratch |
从内置模型规格或 model.blueprint 创建新模型 |
| 继续预训练 | pretrain_mode: continue + model.name_or_path |
载入已有权重,以新的优化任务继续训练 |
| 精确恢复 | training.resume_from_checkpoint |
在支持的 Trainer 中恢复优化器、调度器和训练步数 |
实际过程:
- 解析模型规格或 blueprint。
- 创建新模型,或加载已有模型/checkpoint。
- 加载已有 tokenizer,或使用上游
tokenizer阶段的结果。 - 从
data.sources收集数据。 - 清洗、去重、质量过滤、tokenize 和 sequence packing。
- 创建 Hugging Face
Trainer或原生SaddleTrainer。 - 执行 causal language modeling。
- 保存
final_model、tokenizer 和 Trainer state。
最小结构:
stages: [pretrain]
pretrain_mode: scratch
model:
backend: saddle
config: qwen-tiny-160m
tokenizer: Qwen/Qwen2.5-0.5B
data:
sources:
- type: local
path: data/pretrain.jsonl
text_column: text
streaming: false
training:
max_steps: 1000
distributed:
strategy: single
logging:
output_dir: outputs/pretrain
完整原生模型结构示例见 modular_llm.yaml。
3.5 SFT 逻辑
sft 用“输入指令 → 目标回答”训练模型遵循任务要求。
支持的数据形式包括:
{"instruction":"概括下面内容","input":"待处理文本","output":"目标回答"}
以及 messages:
{"messages":[{"role":"user","content":"问题"},{"role":"assistant","content":"目标回答"}]}
执行过程:
- 从上游
pretrain或model.name_or_path找到模型。 - 检查数据字段、空文本、重复样本和长度。
- 生成
plans/sft_plan.json。 - 根据
use_lora/use_qlora选择全参数、LoRA 或 QLoRA。 - HF 后端调用
PeftSFTTrainer;Saddle 后端调用原生 SFT。 - 保存
sft_checkpoints,并返回新的model_path。
示例见 sft_lora.yaml。
3.6 偏好训练逻辑
preference 用于让模型在多个回答之间学习偏好。
| 方法 | 数据 | 作用 |
|---|---|---|
| DPO | prompt/chosen/rejected |
直接提高 chosen 相对 rejected 的概率 |
| ORPO | prompt/chosen/rejected |
将监督目标和偏好比率目标结合 |
| KTO | prompt/completion/label |
用可取/不可取标签学习偏好;实际 batch 必须大于 1 |
DPO/ORPO 数据:
{"prompt":"怎样排错?","chosen":"先看日志并构造最小复现。","rejected":"直接忽略错误。"}
KTO 数据:
{"prompt":"怎样排错?","completion":"先看日志。","label":true}
执行过程:
- 优先取得 SFT 输出,其次使用预训练输出或基础模型。
- 按选定方法检查数据。
- 写入
plans/preference_plan.json。 - 调用对应 DPO、ORPO 或 KTO Trainer。
- 保存
preference_checkpoints,供评测或导出使用。
示例见 posttrain.yaml 和 dpo_qlora.yaml。
rlhf 阶段当前可实际执行的稳定路径也是 DPO。PPO 需要 reward model 和在线 rollout 接线,目前会明确返回 planned_unsupported;需要离线偏好训练时直接使用 preference 更清楚。
3.7 MOPD 蒸馏逻辑
mopd 的目标是先让当前学生模型生成回答,再让一个或多个教师评价或重写,最后形成新的 SFT 数据。
prompts
→ 学生生成候选
→ 教师评分/聚合
→ mopd_on_policy.jsonl
→ 可选后续 sft
mopd.dry_run: true 只写计划。设置为 false 且提供 prompts、教师和可用模型时才收集数据。
示例见 mopd_sft.yaml。
3.8 多模态和 VLA 逻辑
vla_sft 处理“图像/指令/机器人动作”轨迹:
- 创建并校验动作空间,包括维度、连续/离散类型、范围、夹爪和控制频率。
- 检查图像路径、动作维度和 episode step 连续性。
- 规范化为训练 JSONL。
- 总是保存动作空间和训练计划。
- 只有
vla.train: true时才调用VLATrainer做行为克隆训练。
示例见 vla_sft.yaml。该示例默认 train: false,因此只做规范化和计划。
mllm_sft 和 vision_alignment 当前只完成图文数据规范化与计划保存,不应把返回的 planned 当作模型已经训练。
3.9 图像、音乐和视频生成逻辑
生成训练分为两步:
原始媒体 + 文本
↓
media_cache:Codec 编码媒体,文本编码器生成 condition
↓
NPZ/分片缓存
↓
image_generation / music_generation / video_generation
↓
模型 checkpoint
- 图像:读取
latents[N,C,H,W]和conditions[N,D]。 - 音乐:读取
codes[N,Q,T]、conditions[N,D]和可选 mask。 - 视频:读取
video_latents[N,C,T,H,W]和conditions[N,D]。
训练前会从缓存推断模型维度,并拒绝与手工配置不一致的通道数、码本数或条件维度。
示例:
3.10 世界模型和控制逻辑
world_model 从离线轨迹学习:
当前观测 + 动作
↓
隐状态更新
↓
下一观测、奖励和 continuation 预测
数据通常包含 observation、action、reward 和 done。rssm 使用连续随机状态;categorical_rssm 使用离散类别状态。训练结果可用于 rollout、候选动作评分和空间控制。
eye_control 不直接驱动硬件。它在软件 plant 中应用角度、速度、加速度、电流和温度限制,然后比较 PID 或 RSSM+CEM 控制效果。真实硬件仍需要单独实现安全驱动适配器。
示例:
3.11 评测和导出逻辑
eval 的模型选择顺序:
rlhf 输出
→ preference 输出
→ sft 输出
→ pretrain 输出
→ model.name_or_path
评测成功后可生成 release_gate.json。例如要求 perplexity 不超过阈值:
eval:
enabled: true
tasks: [perplexity]
gate:
enabled: true
rules:
perplexity:
max: 30.0
fail_on_rejection: true
export 使用最新上游模型。如果配置 require_gate: true,没有已接受的门禁结果就拒绝导出。
完整闭环示例见 posttrain_release.yaml。
3.12 Batch、步数和显存逻辑
有效 batch:
effective_batch
= per_device_batch_size
× gradient_accumulation_steps
× num_gpus
显存主要受模型参数量、序列长度、每卡 batch、优化器状态、是否全参数训练和精度影响。常用选择:
- 显存充足:全参数或 LoRA。
- 显存较小且有兼容 CUDA/bitsandbytes:QLoRA。
- OOM:先降低
per_device_batch_size和序列长度,再提高梯度累积保持有效 batch。 - CPU:只适合 tiny 模型、数据检查和调度测试。
bf16 与 fp16 不能同时启用。
3.13 恢复、失败和状态逻辑
阶段级恢复:
pipeline:
resume: true
rerun: []
state_path: pipeline_state.json
系统只会恢复配置指纹和依赖图一致、且上次已完成的阶段。pipeline.rerun 指定某个阶段重跑时,它的下游阶段也会失效并重新执行。
Trainer checkpoint 恢复使用:
training:
resume_from_checkpoint: outputs/run/checkpoint-1000
这与阶段级恢复不同:前者恢复单个 Trainer 内部状态,后者决定整个阶段是否跳过。
任何阶段抛出异常时:
- 记录
failed_stage和错误。 - 更新
pipeline_state.json。 - 尽可能写出
summary.json。 - 停止后续阶段。
- CLI 返回非零退出码,不把失败包装成成功。
3.14 从哪里继续阅读
开发验证:
python -m compileall -q saddlellm tests
python tools/generate_function_reference.py --check
python -m pytest -q
Metadata
Release files for saddlellm 2.35
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| saddlellm-2.35-py3-none-any.whl | Python 3 | none | any | Details for saddlellm-2.35-py3-none-any.whl |
Release files / saddlellm-2.35-py3-none-any.whl
| Download URL | saddlellm-2.35-py3-none-any.whl |
|---|---|
| Size | 749.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d7d702a349336006faa26c3cef1dfe32c735d860b8309901eb72f1b52fb73413
|
|
BLAKE2b-256 checksum How to use checksums |
2369b968bc37030d349c47c66d547f8b1da3a80acd8a4c0514d53713fc52e1c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.0rc2
|
Security for saddlellm 2.35
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.