本节导读:Transformers库只是HuggingFace生态的入口。本节介绍围绕它的进阶工具链——tokenizers、Accelerate、PEFT、evaluate、Optimum——帮助你把"能跑通demo"升级为"工程化交付"。
| 工具库 | 定位 | 典型场景 |
|---|---|---|
tokenizers |
Rust实现的高速分词 | 大规模语料预处理、训练自定义tokenizer |
datasets |
数据集加载与流式处理 | 无需下载全量即可流式训练 |
accelerate |
设备与分布式抽象层 | 混合精度、多卡训练,不侵入业务代码 |
peft |
参数高效微调 | LoRA/QLoRA,单卡微调大模型 |
evaluate |
统一评估接口 | 训练中标准化度量准确率/F1等 |
optimum |
推理优化与导出 | ONNX/TensorRT导出、量化 |
直接用Transformers写训练循环,需要在代码里手动处理设备迁移、梯度缩放、分布式初始化等样板代码;而Accelerate把这些差异收敛为几行配置,PEFT则把"全参数微调一个7B模型需要数十GB显存"压缩到"LoRA微调仅需个位数GB",两者组合是低资源微调的标准姿势。
from accelerate import Accelerator accelerator = Accelerator(mixed_precision="fp16") model, optimizer, train_dataloader = accelerator.prepare( model, optimizer, train_dataloader ) for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) # 替代 loss.backward() optimizer.step() optimizer.zero_grad()
启动多卡只需换命令:accelerate launch train.py(配置由 accelerate config 生成),业务代码零改动。
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training model = prepare_model_for_kbit_training(model) # 4bit基底 lora_cfg = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"], # 只训练注意力投影层 lora_dropout=0.05, task_type="CAUSAL_LM", ) model = get_peft_model(model, lora_cfg) model.print_trainable_parameters() # 输出示例: trainable params: 8.4M || all params: 6.7B || 0.12%
# 导出ONNX并做动态量化 optimum-cli export onnx --model ./my-finetuned --task text-generation ./onnx_out
from optimum.onnxruntime import ORTModelForSequenceClassification model = ORTModelForSequenceClassification.from_pretrained("./onnx_out") # CPU推理吞吐通常可提升1.5~3倍,体积减半以上
import evaluate f1 = evaluate.load("f1") result = f1.compute(predictions=preds, references=labels, average="macro")
datasets(加载/清洗) → tokenizers(编码) → prepare_model_for_kbit_training(4bit基底) → peft(注入LoRA) → accelerate(设备/精度/分布式) → evaluate(训练中评估) → merge_and_unload(合并权重) → optimum(导出ONNX量化) → 部署
Q1:LoRA微调后怎么保存为普通模型?
调用 model.merge_and_unload() 将LoRA权重合并回基底模型,再按常规 save_pretrained 保存,推理时无需再装peft。
Q2:Accelerate与DeepSpeed什么关系?
Accelerate是轻量抽象层,可通过配置接入DeepSpeed后端;小规模实验用纯Accelerate即可,千亿级再引入DeepSpeed ZeRO。
Q3:该选Optimum还是直接用Transformers推理?
CPU/边缘设备部署优先Optimum(ONNX量化收益明显);GPU服务端若已用vLLM/TGI,则无需Optimum,直接服务化部署。
target_modules 选错(如漏掉up/gate投影)会明显影响微调效果,参考同架构开源配置;HuggingFace工具链的本质是"各管一段":数据与分训交给tokenizers/datasets,设备与分布式交给accelerate,微调效率交给peft,评估交给evaluate,部署优化交给optimum。掌握组合调用链,就掌握了从数据到部署的工程闭环。下一节用完整案例把全流程串起来。