AI Infra 训练营
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
HiHuo 主站
GitHub
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
HiHuo 主站
GitHub
  • 扩展

    • 训练专栏 v2 · LLaMA-Factory / DeepSpeed / Megatron 深度调参手册

训练专栏 v2 · LLaMA-Factory / DeepSpeed / Megatron 深度调参手册

🎯 目标:三大主流训练栈的"参数级"操作手册 —— LLaMA-Factory yaml 字段完全讲透,DeepSpeed config 每个 key 解释,Megatron 3D 并行调参原则。 🧪 实测环境:gpu1 (A800-SXM4-40GB) · k3s · Python 3.10 venv /opt/training/venv · transformers 4.46 · peft 0.13 · trl 0.11 · llamafactory(latest) 📅 实测日期:2026-05-27


0. 三大栈定位 — 不要混用

栈抽象层适用场景不适合
LLaMA-FactoryYAML 驱动的"高层封装"7B-72B 范围、单/双机、SFT/DPO/PPO 标准任务自定义 model 结构、超大规模 100B+
DeepSpeed训练引擎 + 分布式策略显存 OOM、ZeRO 优化、参数/优化器 sharding模型并行(TP/PP 不擅长)
Megatron-LM原生 3D 并行 (TP+PP+DP)100B+ 超大模型、千卡集群、从零预训练单机小模型(overkill)

组合策略:

  • 单机 1-8 卡,7B-72B SFT/DPO → LLaMA-Factory (内部走 accelerate/deepspeed)
  • 多机 4-32 卡,70B+ continued pretrain → LLaMA-Factory + DeepSpeed ZeRO-3
  • 32+ 卡,100B+ 从零训 → Megatron-LM(或 Megatron-DeepSpeed 混合)

1. LLaMA-Factory YAML 完全手册

LLaMA-Factory 用 llamafactory-cli train config.yaml 单文件驱动,yaml 字段对应 HuggingFace Trainer + PEFT + TRL 的所有重要参数。下面按模块讲清。

1.1 完整字段清单(按出现顺序)

A. 模型与方法

字段类型默认/示例说明
model_name_or_pathstrQwen/Qwen2.5-7B-InstructHF Hub ID 或本地路径,首次会从 HF 下载到 ~/.cache/huggingface
adapter_name_or_pathstrsaves/qwen-lora加载已有 LoRA adapter(continued LoRA / 加载之前训的)
model_revisionstrmainHF git revision,固定到特定 commit 防止上游更新破坏复现
quantization_bitint4 / 8 / null模型推理/训练时是否走 bitsandbytes 量化,4=QLoRA
quantization_methodstrbitsandbytes / hqq / eetq配套 quantization_bit 选择量化算法
templatestrqwen / llama3 / chatml / vicuna必填,选择 chat template,与模型匹配
flash_attnstrauto / fa2 / disabledflash-attention-2 加速,推荐 auto
rope_scalingstrlinear / dynamic / nullRoPE 长上下文扩展,长文档训练用
shift_attnboolfalseLongLoRA shift short attention,长上下文专用

B. 任务类型(stage)

字段取值说明
stageptPre-Training,继续预训练
sftSupervised Fine-Tuning,主流微调
rmReward Modeling,训 reward model 给 PPO 用
ppoPPO,RLHF
dpoDirect Preference Optimization,绕过 reward model
ktoKahneman-Tversky Optimization,单边数据 DPO
orpoOdds-Ratio Preference Optimization,单阶段 RLHF
simpoSimple Preference Optimization,无 reference model
do_trainbooltrue
finetuning_typefull / lora / freeze全参 / LoRA / 冻结部分层

C. LoRA / PEFT

字段默认说明
lora_targetall (推荐) / q_proj,v_proj应用 LoRA 的 module 名,all = 所有 linear
lora_rank8 (LoRA), 16-64 (DoRA)rank 越大表达力越强,显存/参数也越大
lora_alpha16 (一般 = 2× rank)scaling factor, loraB = lora_alpha/rank
lora_dropout0.0dropout rate
use_rslorafalseRank-Stabilized LoRA, 大 rank 时更稳
use_dorafalseDoRA = decomposed LoRA, 接近 full FT 效果
use_galorefalseGaLore = 梯度低秩投影,显存进一步降
pissa_initfalsePiSSA initialization, 快收敛
loraplus_lr_rationull / 16LoRA+ 给 B 矩阵更大学习率
create_new_adapterfalse是否新建 adapter(继续训设 false)

D. 数据集

字段说明
datasetalpaca_zh,sharegpt_zh
dataset_dirdata (default)
template见 A 部分
cutoff_len1024
max_samplesnull / 1000
overwrite_cachefalse
preprocessing_num_workers16
tokenized_pathnull
train_on_promptfalse
mask_historyfalse
streamingfalse
packingfalse
neat_packingfalse

E. 输出

字段说明
output_dirsaves/qwen-lora
logging_steps10
save_steps500
save_total_limit3
plot_losstrue
report_tonone / wandb / tensorboard
run_nameqwen-lora-exp1

F. 训练超参数

字段默认/示例说明
per_device_train_batch_size1-4单卡 micro batch
gradient_accumulation_steps8-16梯度累积,等效 global batch = N × gpus × accum
learning_rate5e-5(LoRA) / 2e-5(full)LoRA 用 5e-5,full FT 更小
lr_scheduler_typecosine / linear / constantcosine 最常用
warmup_ratio0.1前 10% step warmup
num_train_epochs3.0epoch 数
max_steps-1 / 20设了优先于 epochs(debug 用)
optimadamw_torch / adamw_8bit / paged_adamw_8bit8bit Optimizer 省显存
weight_decay0.0L2 正则
max_grad_norm1.0梯度裁剪上限
bf16true (A100+) / falseBF16 训练
fp16falseFP16 训练(老卡用)
seed42复现
gradient_checkpointingtrue显存换算力,显存吃紧必开

G. 分布式 / DeepSpeed

字段说明
deepspeedexamples/deepspeed/ds_z3_config.json
ddp_find_unused_parametersfalse
ddp_timeout180000000

H. 评估 / 验证

字段说明
val_size0.1
per_device_eval_batch_size1
evaluation_strategysteps / epoch / no
eval_steps500
load_best_model_at_endfalse

I. DPO/PPO/RM 特有

字段适用说明
pref_betaDPO/ORPOKL 散度系数,越大越保守
pref_ftxDPOSFT loss 混合系数
pref_losssigmoid / hinge / ipo / kto_pairDPO 变种 loss 选择
dpo_ftx0.1DPO + SFT joint loss 系数
reward_modelpathPPO 用的 reward model
reward_model_typelora / fullreward model 加载方式
ppo_buffer_size1PPO rollout buffer
ppo_epochs4PPO 内循环 epoch
ppo_score_normfalse奖励标准化

1.2 最简完整 yaml 示例(SFT LoRA)

# === 1. 模型 ===
model_name_or_path: Qwen/Qwen2.5-3B-Instruct
template: qwen
flash_attn: auto

# === 2. 任务 ===
stage: sft
do_train: true
finetuning_type: lora

# === 3. LoRA ===
lora_target: all
lora_rank: 8
lora_alpha: 16
lora_dropout: 0.05

# === 4. 数据 ===
dataset: alpaca_zh_demo
dataset_dir: data
cutoff_len: 512
max_samples: 50
overwrite_cache: true
preprocessing_num_workers: 4
template: qwen

# === 5. 输出 ===
output_dir: /opt/training/saves/qwen-3b-sft-mini
logging_steps: 1
save_steps: 50
plot_loss: true
overwrite_output_dir: true

# === 6. 训练 ===
per_device_train_batch_size: 1
gradient_accumulation_steps: 4
learning_rate: 5.0e-5
lr_scheduler_type: cosine
warmup_ratio: 0.1
num_train_epochs: 1.0
max_steps: 20            # 最简测试只跑 20 步
bf16: true
gradient_checkpointing: true
seed: 42

# === 7. 评估 ===
val_size: 0.0            # 50 样本太小,不切验证集

1.3 启动命令

llamafactory-cli train /opt/training/qwen_lora_sft.yaml

1.4 实测(本节点 2026-05-27 跑通)

⏳ 待 LLaMA-Factory 安装完成后填入实测 log。


2. DeepSpeed 配置每参数详解

DeepSpeed 的 config 是个 JSON,常见 ZeRO Stage 1/2/3 + Offload + Mixed Precision。下面是生产级 ZeRO-3 完整 config,每个 key 都讲。

2.1 ZeRO-3 完整 config 注解

{
  // ===== 1. Mixed precision =====
  "bf16": {
    "enabled": "auto"          // auto = 根据 trainer flag 决定; A100+ 推荐 bf16
  },
  "fp16": {
    "enabled": "auto",
    "loss_scale": 0,            // 0 = dynamic loss scaling, fp16 OOM 时降低
    "loss_scale_window": 1000,
    "initial_scale_power": 16,
    "hysteresis": 2,
    "min_loss_scale": 1
  },

  // ===== 2. Optimizer (DeepSpeed 接管) =====
  "optimizer": {
    "type": "AdamW",
    "params": {
      "lr":          "auto",
      "betas":       "auto",    // [0.9, 0.999] 常用
      "eps":         "auto",
      "weight_decay":"auto"
    }
  },

  // ===== 3. Scheduler =====
  "scheduler": {
    "type": "WarmupDecayLR",
    "params": {
      "warmup_min_lr": "auto",
      "warmup_max_lr": "auto",
      "warmup_num_steps": "auto",
      "total_num_steps": "auto"
    }
  },

  // ===== 4. ZeRO 核心 =====
  "zero_optimization": {
    "stage": 3,                // 1=优化器分片, 2=+梯度分片, 3=+参数分片
    "offload_optimizer": {     // 优化器状态 offload 到 CPU
      "device": "cpu",          // "cpu" / "nvme" / "none"
      "pin_memory": true        // pinned memory 加速 H2D
    },
    "offload_param": {         // 参数 offload 到 CPU(只 stage 3)
      "device": "cpu",
      "pin_memory": true
    },
    "overlap_comm": true,      // 通信与计算重叠,小幅加速
    "contiguous_gradients": true, // 梯度连续存储,反向传播更快
    "sub_group_size": 1e9,     // 参数分组大小,超过这个会再细分
    "reduce_bucket_size":            "auto", // all-reduce 桶大小
    "stage3_prefetch_bucket_size":   "auto", // 参数预取桶
    "stage3_param_persistence_threshold": "auto", // 小参数保留在 GPU 不分片
    "stage3_max_live_parameters":    1e9,    // GPU 同时活的参数上限
    "stage3_max_reuse_distance":     1e9,    // 参数复用距离阈值
    "stage3_gather_16bit_weights_on_model_save": true // ckpt 保存时聚合 weights
  },

  // ===== 5. Batch =====
  "train_batch_size":                "auto",  // = micro × accum × dp_world
  "train_micro_batch_size_per_gpu":  "auto",
  "gradient_accumulation_steps":     "auto",
  "gradient_clipping":               "auto",  // = max_grad_norm

  // ===== 6. Activation Checkpointing =====
  "activation_checkpointing": {
    "partition_activations": true,   // activation 也分片(超大模型)
    "cpu_checkpointing": false,      // activation offload 到 CPU(慢但省显存)
    "contiguous_memory_optimization": false,
    "number_checkpoints": null,
    "synchronize_checkpoint_boundary": false,
    "profile": false
  },

  // ===== 7. 通信 =====
  "steps_per_print": 10,             // log 间隔
  "wall_clock_breakdown": false,     // detailed timer (debug 用)
  "communication_data_type":  "auto" // bf16 / fp16
}

2.2 三种 ZeRO Stage 的选择决策

Stage显存优化通信开销何时用
ZeRO-0 (= 普通 DDP)0最低模型小,显存够,极致速度
ZeRO-1优化器状态分片(~4× 缩)+20%显存有点紧,要保速度
ZeRO-2+ 梯度分片(~8× 缩)+40%大多数 7B-70B 单机训练
ZeRO-3+ 参数分片(无上限)+60-100%70B+ 多机,或 7B 单卡 24GB
ZeRO-3 + CPU offload+ 优化器/参数 CPU巨大32GB 单卡训 70B 的极限
ZeRO-3 + NVMe offload+ 优化器 NVMe灾难性试图在 RTX 3090 上训 70B(玩具级)

2.3 显存预算计算公式(超重要)

单卡显存占用 ≈ (P/N) × [2 (BF16 weights) + 2 (BF16 gradients) + 12 (Adam states)]
              + Activation + KV cache
              + Communication buffers

其中:
  P = 模型参数量(Billion)
  N = ZeRO 分片数(stage 3 时 = world_size)

例: 70B 模型, BF16, 8 卡 ZeRO-3
  权重 + 梯度 + Adam ≈ 70B × 16 bytes / 8 = 140 GB / 8 = 17.5 GB/卡
  Activation (rank+ckpt) ≈ 5-10 GB/卡
  合计 ≈ 25-30 GB/卡 ✓ A800-40GB 装得下

2.4 LLaMA-Factory 内置 DeepSpeed 模板

LLaMA-Factory 自带几份开箱即用的 DeepSpeed config:

examples/deepspeed/ds_z0_config.json  # ZeRO-0
examples/deepspeed/ds_z2_config.json  # ZeRO-2
examples/deepspeed/ds_z2_offload_config.json  # ZeRO-2 + CPU optim offload
examples/deepspeed/ds_z3_config.json  # ZeRO-3
examples/deepspeed/ds_z3_offload_config.json  # ZeRO-3 + CPU param+optim offload

直接在 yaml 里指定:deepspeed: examples/deepspeed/ds_z3_config.json


3. Megatron-LM 3D 并行调参手册

Megatron 是 NVIDIA 出品的"原生"超大模型训练框架,核心创新是 3D 并行:Data + Tensor + Pipeline。

3.1 3D 并行三维度

维度简写切分对象跨设备通信关键参数
Data ParallelDP把 batch 切分到 N 个 replica,each holds 完整模型all-reduce 梯度--data-parallel-size N
Tensor ParallelTP切单层的 weight 矩阵(列切 / 行切)all-reduce activation--tensor-model-parallel-size N
Pipeline ParallelPP按 layer 切分,GPU 0 装 layer 0-15, GPU 1 装 16-31...p2p send/recv activation--pipeline-model-parallel-size N

公式:TP × PP × DP = total_gpus

3.2 调参原则

A. 何时用哪个并行?

情况选择
模型放得下单卡DP only(最快)
单卡放不下,节点内(NVLink)加 TP(NVLink 带宽 600+ GB/s,TP 通信吃得消)
单卡放不下,跨节点(IB/RDMA)加 PP(p2p 通信少,跨节点便宜)
极致大模型 (175B+)TP + PP + DP 同时上

B. TP 大小的选择

  • TP 通信量大,几乎只能限制在单节点内(同一台 8卡机)
  • A100/H100 节点常用 TP=8(整机)
  • A800 (NVLink 减半) 推荐 TP=4
  • 推荐:TP = min(节点内卡数, head_count_per_layer)(TP 必须整除 num_attention_heads)

C. PP 大小的选择

  • PP 引入 bubble(气泡),有效率损失
  • bubble_ratio = (PP-1) / (micro_batches_per_pipeline_step)
  • 推荐 micro batches > 4 × PP,降低 bubble
  • 一般 PP ∈ {2, 4, 8, 16}

D. DP 大小的选择

  • DP = total / (TP × PP)
  • DP 越大,全局 batch 越大,梯度越稳但收敛性需要调 lr scaling

3.3 典型配置例

例 1: 单机 8×A100 训 13B

# 13B 单卡放得下,但训练显存要 2× 参数,所以走 TP=2 + DP=4
python pretrain_gpt.py \
  --tensor-model-parallel-size 2 \
  --pipeline-model-parallel-size 1 \
  --data-parallel-size 4 \
  --micro-batch-size 2 \
  --global-batch-size 256 \
  ...

例 2: 8 机 64×A100 训 70B

# 70B BF16 模型 weight 140GB,要靠 TP+PP
python pretrain_gpt.py \
  --tensor-model-parallel-size 8 \         # 节点内 TP
  --pipeline-model-parallel-size 4 \       # 4 段 pipeline (16 卡 / 段)
  --data-parallel-size 2 \                 # = 64 / (8 × 4)
  --micro-batch-size 1 \
  --global-batch-size 1024 \
  --num-layers-per-virtual-pipeline-stage 4 \  # interleaved schedule 减小 bubble
  ...

例 3: 32 机 256×H100 训 175B

python pretrain_gpt.py \
  --tensor-model-parallel-size 8 \
  --pipeline-model-parallel-size 8 \
  --data-parallel-size 4 \
  --sequence-parallel \                    # 序列维度也切, 进一步省显存
  --use-distributed-optimizer \            # ZeRO-1 风格
  --recompute-granularity selective \      # 选择性 activation recompute
  --recompute-method uniform \
  --micro-batch-size 1 \
  --global-batch-size 2048 \
  ...

3.4 Megatron 关键参数手册

类别参数作用
并行--tensor-model-parallel-sizeTP
--pipeline-model-parallel-sizePP
--context-parallel-size长上下文(Megatron 0.7+)序列并行
--expert-model-parallel-sizeMoE Expert 并行
--sequence-parallel序列维度切分(降 activation 显存)
--use-distributed-optimizer类似 ZeRO-1
Batch--micro-batch-size单卡每次 forward 的 batch
--global-batch-size全局 batch(= micro × DP × pipeline_micro_batches)
显存--recompute-granularity full/selectiveactivation checkpointing
--recompute-method uniform/block重算策略
--recompute-num-layers N每几层 recompute
通信--overlap-grad-reduceall-reduce 与反向重叠
--overlap-param-gather参数 gather 与计算重叠
模型--num-layers层数
--hidden-sizehidden dim
--num-attention-headsattention head 数(必须能被 TP 整除)
--ffn-hidden-sizeFFN dim
--seq-length序列长度
训练--lr / --min-lr学习率
--lr-warmup-iterswarmup
--lr-decay-style cosine/linear
--train-iters总迭代步数
数据--data-pathbin/idx 文件路径
--tokenizer-type GPT2BPETokenizer
--data-impl mmapmmap 加速
ckpt--save / --loadckpt 路径
--save-intervalsave 间隔
--ckpt-format torch_dist分布式 ckpt

3.5 Megatron 调参三大坑

坑 1: TP 大小必须整除 attention heads

num_attention_heads = 32
TP=8 → 32/8=4 heads/rank ✓
TP=16 → 32/16=2 heads/rank ✓
TP=12 → 32/12 不整除 ✗ 报错

坑 2: PP bubble 把利用率打骨折

PP=8, micro_batches=8
bubble_ratio = (8-1) / 8 = 87.5% 利用率
要 micro_batches >= 4 × PP, 即 32 才能接受

坑 3: ZeRO + TP/PP 不能直接组合

DeepSpeed ZeRO 是参数分片,Megatron TP 是 weight 切片 — 两者对模型参数的"持有方式"不一样。要混用,必须用 Megatron-DeepSpeed(Microsoft 维护的特殊分支)。


4. 实测 · LLaMA-Factory 最简 SFT (Qwen2.5-3B + LoRA + 20 steps)

✅ 本节为 2026-05-27 在 gpu1 (A800-40GB) 实跑结果,所有数据 1:1 抄自训练 log。

4.1 环境准备

# Python venv (避免污染 chromadb venv)
python3 -m venv /opt/training/venv
source /opt/training/venv/bin/activate
pip install -q --upgrade pip
pip install -q torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121
pip install -q transformers peft datasets accelerate trl
pip install -q llamafactory

实测安装产物:

LLaMA-Factory  0.9.3
transformers   4.52.4
peft           0.15.2
torch          2.5.1+cu121   (CUDA available: True)

4.2 yaml 文件 /opt/training/qwen_lora_sft.yaml

(已贴在 1.2 节)

4.3 数据集 /opt/training/data/

data/
├── dataset_info.json         # 数据集 registry
└── alpaca_zh_demo.json       # 50 条 K8s/LLM 中文 SFT 样本

dataset_info.json 关键字段:

{
  "alpaca_zh_demo": {
    "file_name": "alpaca_zh_demo.json",
    "formatting": "alpaca",
    "columns": {"prompt": "instruction", "query": "input", "response": "output"}
  }
}

4.4 启动命令

export HF_HOME=/opt/hf-cache     # 用本地 cache 中的 Qwen2.5-3B
export HF_HUB_OFFLINE=1          # 强制离线,避免 WAN 拉模型
source /opt/training/venv/bin/activate
cd /opt/training
llamafactory-cli train qwen_lora_sft.yaml 2>&1 | tee train.log

4.5 实测 log 节选 (2026-05-27 01:59:29 → 01:59:59)

A. 模型加载

Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]
Loading checkpoint shards:  50%|█████     | 1/2 [00:11<00:11, 11.13s/it]
Loading checkpoint shards: 100%|██████████| 2/2 [00:17<00:00,  8.54s/it]

B. LoRA wiring 关键 log

[INFO] llamafactory.model.model_utils.checkpointing >> Gradient checkpointing enabled.
[INFO] llamafactory.model.model_utils.attention     >> Using torch SDPA for faster training and inference.
[INFO] llamafactory.model.adapter                   >> Upcasting trainable params to float32.
[INFO] llamafactory.model.adapter                   >> Fine-tuning method: LoRA
[INFO] llamafactory.model.model_utils.misc          >> Found linear modules: k_proj,gate_proj,up_proj,q_proj,v_proj,o_proj,down_proj
[INFO] llamafactory.model.loader                    >> trainable params: 14,966,784 || all params: 3,100,905,472 || trainable%: 0.4827
[INFO] trainer >> ***** Running training *****
[INFO] trainer >>   Num examples = 50
[INFO] trainer >>   Num Epochs = 2
[INFO] trainer >>   Instantaneous batch size per device = 1
[INFO] trainer >>   Total train batch size (w. parallel, distributed & accumulation) = 4
[INFO] trainer >>   Gradient Accumulation steps = 4
[INFO] trainer >>   Total optimization steps = 20
[INFO] trainer >>   Number of trainable parameters = 14,966,784

💡 关键观察:lora_target: all 自动展开成 7 个 linear module (q/k/v/o + gate/up/down),trainable = 14.97M ≈ 3.1B 的 0.48%。

C. 20 步 loss 全量(每步都 log)

step  loss    grad_norm  learning_rate     epoch
  1   3.2058   3.84      0.0e+00           0.08    (warmup step 1)
  2   3.5172   6.40      2.5e-05           0.16    (warmup step 2, lr 上升)
  3   3.7833   5.65      5.0e-05           0.24    (warmup 结束,lr peak)
  4   4.4129   6.31      4.96e-05          0.32    (loss 抖动峰)
  5   3.6846   4.76      4.85e-05          0.40
  6   3.6415   3.72      4.67e-05          0.48
  7   2.9743   3.27      4.42e-05          0.56    (cosine 衰减开始)
  8   3.5236   4.20      4.11e-05          0.64
  9   3.6316   3.98      3.75e-05          0.72
 10   2.9823   2.61      3.36e-05          0.80
 11   2.6561   2.79      2.93e-05          0.88
 12   3.5730   3.54      2.50e-05          0.96
 13   2.9148   3.13      2.07e-05          1.00    (epoch 1 完成)
 14   3.0117   2.53      1.64e-05          1.08
 15   2.7595   3.01      1.25e-05          1.16
 16   3.2232   2.50      8.93e-06          1.24
 17   2.5869   1.96      5.85e-06          1.32    (loss 最低附近)
 18   2.4137   2.08      3.35e-06          1.40    ← 全程最小 loss
 19   2.9632   2.22      1.51e-06          1.48
 20   2.6613   2.35      3.80e-07          1.56    (cosine 接近 min_lr)

D. 训练完成 summary

{'train_runtime': 29.69, 'train_samples_per_second': 2.695, 'train_steps_per_second': 0.674,
 'train_loss': 3.2060306668281555, 'epoch': 1.56}
epoch                    =       1.56
train_loss               =      3.206
train_runtime            = 0:00:29.69
Figure saved at: /opt/training/saves/qwen-3b-sft-mini/training_loss.png
Training completed. Do not forget to share your model on huggingface.co/models =)

4.6 实测数据解读

指标实测值解读
模型加载耗时17 s (BF16 6GB 落盘)二次启动可降到 < 5s(走 mmap)
训练耗时29.69 s for 20 steps单步 1.5s,跟 vLLM benchmark 数据级别一致
Trainable%0.48 % (14.97M / 3.10B)典型 LoRA rank=8 + 7 targets 规模
LR schedulecosine,0 → 5e-5 → 3.8e-7warmup 2 步(=20×0.1)+ cosine decay,工作正常
Loss 趋势3.21 → 2.41 → 2.66总体下降但抖动大(只 20 步、batch=4 太小,样本极少)
显存峰值20 GB (nvidia-smi)3B BF16(6GB) + grad(6GB) + optim(7GB) + activation,gradient_ckpt 已开

⚠️ 诚实声明:20 步训练不可能真正"学到"东西,目的是验证整条 LLaMA-Factory 链路通畅、yaml 字段被正确消费、checkpoint 能落盘、loss 形态符合 cosine schedule 预期。生产 SFT 至少 1000-10000 steps,LoRA rank=16-64,数据量 1K-100K 级别。

4.7 输出产物 /opt/training/saves/qwen-3b-sft-mini/

adapter_model.safetensors    58 MB   ← LoRA 权重(对比 base 3B = 6 GB,1%)
adapter_config.json          0.9 KB  ← LoRA 配置(rank/alpha/target_modules)
trainer_state.json           4.1 KB  ← 训练状态(可 resume)
trainer_log.jsonl            3.6 KB  ← 每 step JSONL log
training_args.bin            5.7 KB  ← HF TrainingArguments pickled
training_loss.png            49 KB   ← 自动绘制 loss 曲线
all_results.json             200 B   ← summary
chat_template.jinja          2.5 KB  ← Qwen chat template
tokenizer.json               11 MB   ← 完整 tokenizer
checkpoint-20/               (同上但只含 step 20)

adapter_config.json 实际内容(展示 LLaMA-Factory yaml 如何映射到 peft):

{
  "base_model_name_or_path": "Qwen/Qwen2.5-3B-Instruct",
  "peft_type": "LORA",
  "task_type": "CAUSAL_LM",
  "r":  8,                 ← lora_rank: 8
  "lora_alpha": 16,        ← lora_alpha: 16
  "lora_dropout": 0.05,    ← lora_dropout: 0.05
  "target_modules": ["k_proj","gate_proj","up_proj","q_proj","v_proj","o_proj","down_proj"],
  "bias": "none",
  "use_dora": false,
  "use_rslora": false,
  "modules_to_save": null,
  "inference_mode": true
}

🔑 这个 adapter 可以直接被 vLLM / transformers 加载:PeftModel.from_pretrained(base_model, "/opt/training/saves/qwen-3b-sft-mini")。


5. 选型决策 cheat sheet

单机 1-4 卡, 7B-13B SFT/DPO:
  → LLaMA-Factory + LoRA, ZeRO-0 或不开 DeepSpeed
  → 命令: llamafactory-cli train config.yaml

单机 8 卡, 13B-70B SFT:
  → LLaMA-Factory + LoRA + DeepSpeed ZeRO-2
  → yaml 加: deepspeed: examples/deepspeed/ds_z2_config.json

多机 16+ 卡, 70B+ 全参 SFT:
  → LLaMA-Factory + Full FT + DeepSpeed ZeRO-3
  → 多机用 accelerate config + slurm/torchrun

集群 64+ 卡, 70B+ 从零预训练:
  → Megatron-LM 原生(TP+PP+DP)
  → 或 Megatron-DeepSpeed(更灵活)

集群 256+ 卡, 100B+ MoE 模型:
  → Megatron-LM + ExpertParallel + ContextParallel
  → 或 DeepSeek 风格的 自定义训练框架

6. 一句话总结

LLaMA-Factory 是高层 yaml DSL · DeepSpeed 是显存优化引擎(ZeRO 系列) · Megatron-LM 是 3D 并行原生框架。

个人/小团队 7-72B 训练,LLaMA-Factory + DeepSpeed ZeRO-2/3 全搞定;只有当卡数 ≥ 64 且模型 ≥ 70B,才真正需要 Megatron。

三者的 yaml/config/CLI flag 看起来眼花,但本质都在回答同一个问题:显存装不下时,谁来分片 + 谁去 offload + 通信代价多少。看清这一点,所有参数都能自己推导。


附录 A:LLaMA-Factory 数据格式备忘

// data/dataset_info.json 登记数据集
{
  "alpaca_zh_demo": {
    "file_name": "alpaca_zh_demo.json",
    "formatting": "alpaca",         // alpaca / sharegpt / preference 三大格式
    "columns": {
      "prompt":   "instruction",
      "query":    "input",
      "response": "output",
      "system":   "system",         // 可选
      "history":  "history"         // 可选
    }
  }
}
// data/alpaca_zh_demo.json 样本格式
[
  {
    "instruction": "请简单介绍 K8s 的 Pod。",
    "input": "",
    "output": "Pod 是 Kubernetes 最小调度单元,..."
  }
]

附录 B:相关文档交叉引用

  • Bonus · 训练框架全景手册 — 11 个训练框架对比 + 11 种训练模式
  • Bonus-2 · RAG/Agent 实战 — 推理侧 RAG/Agent
  • Bonus-3 · 推理优化全景 — vLLM benchmark + 量化 + spec decoding
在 GitHub 上编辑此页