使用 Training Hub 对 LLM 进行微调
training_hub 是一个 Python 库,它将多种 LLM 后训练算法——Supervised Fine-Tuning (SFT)、Orthogonal Subspace Fine-Tuning (OSFT)、LoRA / QLoRA,以及 continued pre-training (CPT)——封装在单个函数调用(sft(...)、osft(...)、lora_sft(...))之后,以统一方式处理单 GPU、多 GPU 和多节点训练。
- 自动内存管理 —
max_tokens_per_gpu会限制 GPU 内存占用,并自动计算 micro-batch size 和 gradient accumulation,以满足你的目标effective_batch_size。 - OSFT 实现了 Nayak et al., 2025 (arXiv:2504 .07097) —— 将权重更新限制在正交子空间中,可在没有 replay data 的情况下防止 catastrophic forgetting。
- QLoRA 以 4-bit 方式加载冻结的 base model,并且只训练 LoRA adapters,使大型模型能够适配单个较小的 GPU 切片(Dettmers et al., 2023, arXiv:2305 .14314)。
- Continued pre-training (CPT) 在原始文本语料上执行 next-token prediction,以便在 instruction tuning 之前注入领域知识。
- 内置 checkpointing、experiment tracking 和 Liger kernel 支持。
training_hub 是 RHOAI / Open Data Hub 用于通过单一 API 暴露后训练
算法的上游库,而 Alauda AI 则在 Kubeflow Trainer v2
(TrainJob / ClusterTrainingRuntime)上运行同一套代码。算法(此库)
与 distributed runtime(Kubeflow Trainer)之间的拆分遵循 Open Data Hub 的
architecture decision records
(参见 distributed-workload 和 workbenches 组件文档)——因此,这里的示例
在 workbench notebook 中运行,或作为集群 TrainJob 运行时,都会平滑映射到
相同的 sft / osft / lora_sft entrypoint。
要求
- 你的 cluster 中已安装 Alauda AI Workbench。
- 一个具有互联网访问能力(或内部 PyPI 镜像)、至少一个 NVIDIA GPU,以及用于 checkpoint 的持久化存储的 workbench。
- HuggingFace 模型名称或本地路径。
- JSONL 格式的训练数据(见下文)。
数据格式
每一行都是一个对话:
角色:system、user、assistant、pretraining。Masking:
- SFT(默认)——只有
assistant内容会对 loss 产生贡献。为某个 sample 添加"unmask": true可将所有非 system 内容都纳入训练。 - OSFT——由
unmask_messages控制(默认False)。
如果数据集已预先 tokenized,并包含 input_ids / labels,则可以通过 use_processed_dataset=True 支持。
运行示例 notebooks
下载到你的 workbench 中,并逐 cell 执行:
安装并配置:
在预构建的 traininghub0.1-cu126-amd64:v0.1.0 runtime image 上,请在全新的 venv 中安装 training-hub
——因为 pip install --user training-hub 会将 transformers
升级到与随附 peft 不兼容的版本:
编辑参数 cells:
内置的模型预设覆盖 Qwen 2.5 7B、Llama 3.1 8B、Phi 4 Mini,以及通用的 7B / 小型模型。
运行所有 cells。最后的训练 cell 会调用:
checkpoint 会在每个 epoch 写入 ckpt_output_dir(由 checkpoint_at_epoch 控制)。
关键参数
通用(SFT 和 OSFT):
仅 OSFT:
QLoRA(4-bit LoRA)
QLoRA 以 4-bit NormalFloat (NF4) 精度冻结 base model,并且只训练其上的小型 LoRA adapter 矩阵。对于完整 SFT 需要约 ~60 GiB 的 7B 模型,它可以在单个 16–24 GiB GPU(或 HAMI vGPU slice)上运行。只要你受限于 GPU 内存,就应当使用它; 代价是会有轻微的量化质量差距,以及稍慢的 step。
training_hub 通过 lora_sft(...) 提供 QLoRA——即 LoRA 加上 bitsandbytes 的 4-bit 选项:
QLoRA 专用参数:
输出是一个 LoRA adapter,而不是完整 checkpoint。部署时,可使用 peft 加载 base + adapter,
或者调用一次 merge_and_unload() 将其合并并导出为独立模型。
通过 bitsandbytes 实现的 4-bit QLoRA 需要具备计算能力 sm_75 或更高
(Turing / Ampere / Hopper)的 NVIDIA GPU。traininghub0.1-cu126-amd64
runtime 已经捆绑了 trl、peft 和 bitsandbytes。默认的 lora_sft 后端是 unsloth;
如果需要完全控制,也可以在同一个 runtime image 上直接驱动 peft + bitsandbytes。
NPU: bitsandbytes 4-bit 在 Huawei Ascend 上不可用。请在
llamafactory0.9-cann8.5-arm64 runtime 上使用不含 4-bit 的 LoRA(finetuning_type: lora)
作为参数高效路径——参见 Fine-tune and Pretrain on Ascend NPU。
持续预训练 (CPT)
持续预训练 (CPT) 保持原始的 next-token prediction 目标,但将其运行在来自你的领域 (医疗、法律、代码、新语言)的 原始文本语料 上。它注入的是 知识和词汇——与 通过 chat 数据教授 行为 的 SFT/OSFT 不同。常见流水线是 CPT → SFT → alignment。
training_hub 通过相同的 sft(...) entrypoint 运行 CPT,并设置 is_pretraining=True:
loss 会覆盖 所有 token(不使用仅 assistant masking),并且文档会被打包到固定大小的
block_size window 中。
CPT 数据是原始文本,不是 chat turns——在 document_column_name 下每行一个 document:
CPT 专用参数:
CPT 会更新 所有 权重并写出完整 checkpoint。它可能导致 general ability 的 catastrophic
forgetting——可通过较低的 learning rate、混入一部分通用领域文本,以及随后执行一次 SFT/OSFT
来缓解(将 model_path 指向 CPT checkpoint)。如果 forgetting 是主要顾虑,请优先选择 OSFT。
NPU: 全参数持续预训练也可以通过 MindSpeed-LLM runtime(pretrain_gpt.py)在 Huawei Ascend 上运行。
参见 Fine-tune and Pretrain on Ascend NPU 和
qwen25_pretrain_verify.ipynb 示例。
多节点
在每个节点上运行该 notebook(或脚本),并使用相同的 rdzv_id / rdzv_endpoint,以及不同的 node_rank:
在训练开始之前,所有节点都需要能够访问 rdzv_endpoint。