跳到主要内容
在 AutoDL 上用 LLaMA-Factory 微调 GPT-OSS-20B | 极客日志
Python AI
在 AutoDL 上用 LLaMA-Factory 微调 GPT-OSS-20B 记录了在 AutoDL 云 GPU 上使用 LLaMA-Factory 微调 GPT-OSS-20B 的完整流程:先搭好 PyTorch/Ubuntu/Python/CUDA 环境并安装依赖、下载基础模型和 SwanLab,再用 identity_fixed 与 alpaca_en_demo 进行 LoRA 训练,随后可选择合并权重或直接在 vLLM 中挂载 LoRA 部署推理。文中还补了两个常见坑:GPT-OSS 模板的 token 不匹配,以及 Python 3.11 版本要求。
前言
这篇记录的是我在云 GPU 上用 LLaMA-Factory 微调 GPT-OSS-20B 的完整过程,包含环境配置、训练、LoRA 权重合并,以及最后用 vLLM 起服务的步骤。
我最后选的是 LLaMA-Factory + LoRA 。不是因为它最'优雅',而是它足够省事,踩坑也相对可控:
框架本身比较成熟,训练流程不用自己拼
LoRA 对显存友好,云 GPU 上更现实
在采购对话这类场景里,微调后的效果已经够用
方案概览
组件 选择 说明 微调框架 LLaMA-Factory 0.9.4 开源大模型训练框架 基础模型 GPT-OSS-20B 200 亿参数 MoE 模型 微调方式 LoRA 低秩适配,显存占用更低 推理引擎 vLLM 高性能推理服务 实验监控 SwanLab 训练过程可视化 GPU 资源 AutoDL H20 云 GPU 实例 远程传文件 文件传输工具 本地与远程服务器之间的加密上传、下载、管理文件
环境配置
租云 GPU 的时候,镜像别随便选。这个地方要是错了,后面一堆兼容性问题,排起来很磨人。
推荐配置 :
参数 选择 说明 基础镜像 PyTorch Ubuntu 22.04 Python 3.12 必须 3.11+,LLaMA-Factory 要求 CUDA 12.8 版本不能太低 PyTorch 2.8.0
⚠️ 重要提醒 :GPT-OSS 模型默认会尝试使用 Flash Attention 3,但这个特性目前只支持 Hopper 架构 GPU,比如 H100/H800。
项目初始化
克隆 LLaMA-Factory
cd /root/autodl-tmp
mkdir -p /root/autodl-tmp
wget https://github.com/hiyouga/LLaMA-Factory/archive/refs/tags/v0.9.4.zip
unzip v0.9.4.zip
LlamaFactory-0.9.4 LLaMA-Factory
mv
安装依赖 cd /root/autodl-tmp/LLaMA-Factory
pip install -e '.[torch,metrics]' -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install evaluate scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
python -c "import llamafactory, torch; print('LLaMA-Factory 版本:', llamafactory.__version__)"
下载基础模型 使用 ModelScope 下载 GPT-OSS-20B 模型:
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
modelscope download --model openai-mirror/gpt-oss-20b \
--local_dir /root/autodl-tmp/models/gpt-oss-20b
💡 模型下载会花一些时间。最好在不占 GPU 的时候先下完,不然云机器的钱会白白烧在等待上。
安装 SwanLab
训练配置
数据集准备
identity_fixed :用来定模型身份信息,把 name 和 author 之类的字段填进去
alpaca_en_demo :通用指令微调数据集
[ { "instruction" : "你好" , "input" : "" , "output" : "您好,我是智能小助手,一个由 AI 开发的 AI 助手。" } , { "instruction" : "你是谁?" , "input" : "" , "output" : "您好,我是智能小助手,由 AI 发明。我可以为您提供多种多样的服务。" } ]
配置文件 编辑 examples/train_lora/gpt_lora_sft.yaml:
model_name_or_path: /root/autodl-tmp/models/gpt-oss-20b
lora_rank: 8
lora_alpha: 16
lora_dropout: 0.05
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
dataset: identity_fixed,alpaca_en_demo
template: gpt_oss
cutoff_len: 2048
max_samples: 1000
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
val_size: 0.1
eval_strategy: steps
eval_steps: 100
load_best_model_at_end: true
bf16: true
gradient_checkpointing: true
report_to: swanlab
run_name: gpt-oss-20b-lora
训练步数计算 训练步数其实不复杂,先把量级估出来,心里就有数了:
总样本 = 1090(数据集总量)
训练集 = 1090 × 0.9 = 981 个
有效 batch = 1 × 8 = 8
每轮步数 = 981 ÷ 8 ≈ 123 步
总步数 = 123 × 3 轮 = 369 步
开始训练 cd /root/autodl-tmp/LLaMA-Factory
llamafactory-cli train examples/train_lora/gpt_lora_sft.yaml \
2>&1|tee logs/training_$(date +%Y%m%d_%H%M%S).log
训练时可以直接看 SwanLab 曲线,至少能知道是不是早早跑偏了。
权重合并(可选) LoRA 训练完以后,可以把适配器和基础模型合成一个完整模型。这个步骤不是必须的,不合并也能直接推理。
为什么要合并 方式 优点 缺点 合并后推理 配置简单,推理速度快 需要额外合并步骤 LoRA 直接加载 无需合并步骤 配置稍复杂
合并命令 cd /root/autodl-tmp/LLaMA-Factory
llamafactory-cli export \
--model_name_or_path /root/autodl-tmp/models/gpt-oss-20b \
--adapter_name_or_path saves/gpt-20b/lora/sft \
--export_dir models/gpt20b_lora_sft \
--export_size 2\
--export_legacy_format false
--model_name_or_path:基础模型路径
--adapter_name_or_path:LoRA 权重保存路径
--export_dir:合并后模型的保存路径
vLLM 推理部署 vLLM 用来起推理服务比较顺手,下面两种方式都能用。
安装 vLLM pip install vllm fastapi uvicorn pydantic -i https://pypi.tuna.tsinghua.edu.cn/simple
方案一:直接加载 LoRA(不合并权重) 这条路更灵活,不用先合并,直接动态挂载 LoRA 适配器。
export FLASH_ATTN_FORCE_FA2=1
export DISABLE_FLASH_ATTN_3=1
vllm serve /root/autodl-tmp/models/gpt-oss-20b \
--enable-lora \
--lora-modules gpt-lora=/root/autodl-tmp/LLaMA-Factory/saves/gpt-20b/lora/sft \
--tokenizer /root/autodl-tmp/models/gpt-oss-20b \
--tensor-parallel-size=1\
--trust-remote-code \
--enable-prefix-caching \
--gpu-memory-utilization 0.9\
--host 0.0.0.0 \
--port 80\
--api-key your-secret-api-key
curl -X POST "http://你的 IP:80/v1/chat/completions" \
-H "Authorization: Bearer your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-lora", "messages": [ {"role": "user", "content": "你好,请介绍一下你自己"} ], "temperature": 0.7, "max_tokens": 200 }'
方案二:使用合并后的模型 vllm serve /root/autodl-tmp/LLaMA-Factory/models/gpt20b_lora_sft \
--host 0.0.0.0 \
--port 80\
--trust-remote-code \
--gpu-memory-utilization 0.9\
--max-model-len 4096\
--served-model-name gpt-procurement \
--api-key your-secret-api-key
服务启动后,终端会打印出监听信息,这时再调接口就行。
curl -X POST "http://你的 IP:80/v1/chat/completions" \
-H "Authorization: Bearer your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-procurement", "messages": [ {"role": "user", "content": "你好,请介绍一下你自己"} ], "temperature": 0.7, "max_tokens": 200 }'
两种方案对比 对比项 方案一(LoRA 直接加载) 方案二(合并后使用) 是否需要合并 ❌ 不需要 ✅ 需要 配置复杂度 稍复杂 简单 推理速度 稍慢 快 显存占用 略高 略低 灵活切换 LoRA ✅ 支持 ❌ 不支持 推荐场景 开发测试 生产部署
常见问题
问题 1:Token 不匹配错误 { "error" : { "message" : "Unexpected token 200002 while expecting start token 200006" , "type" : "BadRequestError" } }
原因 :GPT-OSS 模型的模板文件里用了 <|end|> 作为结束 token,但它和实际 tokenizer 对不上。
修改 LlamaFactory-0.9.4/src/llamafactory/data/template.py 中的 gpt_oss 模板:
format_assistant=StringFormatter(slots=["{{content}}<|end|>" ]),
format_assistant=StringFormatter(slots=["{{content}}" ]),
问题 2:Python 版本不匹配 Package 'llamafactory' requires a different Python: 3.10 .16 not in '>=3.11.0'
conda create -n py311 python=3.11
conda activate py311
收尾 这套流程从环境到部署都能跑通,关键点不在'能不能微调',而在几个容易漏掉的细节:Python 版本、模板名写对、Flash Attention 3 的兼容性,以及推理时是直接挂 LoRA 还是先合并权重。
如果只是验证效果,我会先走 LoRA 直加载,省时间;如果要稳定对外提供服务,再合并成单模型会更省心。
参考资料 相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online