news 2026/10/13 3:45:30

LLaMA-Factory 微调实战:从 GitHub 下载到跑通第一条训练命令

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLaMA-Factory 微调实战:从 GitHub 下载到跑通第一条训练命令

简介:本资源为从 GitHub 下载的 LLama-factory 完整源码包,面向大模型微调初学者与工程实践者,可用于本地搭建 LLaMA 系列模型的训练、微调与推理环境。压缩包共 408 个文件,约 231.59MB,以 146 个 Python 源码、108 个 pyc 编译文件、48 个 YAML 配置、23 个 JSON 参数文件为主,另含 txt 说明、md 文档、Dockerfile、Makefile 及少量图片与压缩子包,覆盖配置、脚本、容器化部署等模块,目录结构完整,便于按需检索与二次开发。目前已有 1728 人学习下载,适合希望快速上手 LLama-factory 微调流程、研究其配置体系与工程组织的读者参考使用。

1. 从 GitHub 拉下 LLama-factory 之后,先别急着 pip install

很多人第一次接触大模型微调,都是冲着 LLaMA-Factory 来的。它把数据准备、模型加载、LoRA/QLoRA、全参微调、DPO、推理评测这一整套流程收进了一个仓库,命令行和 WebUI 两条路都能走。你从 GitHub 上把包拉下来,解压或 clone 到本地,这一步其实只是拿到了“施工图纸”,离真正跑起来还差环境、数据格式、显存估算和参数配置四道关。我见过太多人卡在pip install -e .之后的第一个报错上,然后开始怀疑是不是包有问题。实际上,LLaMA-Factory 的坑大多不在代码本身,而在你对“微调一个模型到底需要什么”这件事的预期上。这篇笔记就按我自己的落地顺序,把从 GitHub 下载到跑通第一条训练命令的路径拆开讲,适合手里已经有一份代码、但还没让它动起来的人。

2. 环境与依赖:把“能跑”和“跑得动”分开处理

2.1 先确认你的 CUDA 和 PyTorch 是不是一对

从 GitHub 拉下来的 LLaMA-Factory,根目录下通常有requirements.txt和setup.py。很多人上来就pip install -r requirements.txt,结果 torch 版本被覆盖,和本机 CUDA 驱动对不上,训练时直接报CUDA error: no kernel image is available for execution on the device。我的习惯是先锁死 PyTorch,再装项目依赖。

# 先看驱动支持的 CUDA 上限,不要只看 nvcc nvidia-smi # 假设驱动支持 CUDA 12.1,装对应 torch,不要用默认最新版 pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 \ --index-url https://download.pytorch.org/whl/cu121 # 再进项目目录装其余依赖,让 pip 不要动 torch pip install -r requirements.txt --no-deps pip install -e . --no-deps

这里--no-deps是关键,它阻止 pip 在装其他包时顺带升级 torch。装完用下面这段验证,输出为 True 才算环境对齐。

import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_capability(0)) # 例如 (8, 6) 表示 30 系

参数说明:get_device_capability返回的是算力版本,后面选bf16还是fp16要看它。算力低于 8.0 的卡,bf16 支持不完整,硬开会在训练中途 loss 变 NaN。

2.2 用 conda 隔离,别在 base 里折腾

我一般会建一个独立环境,Python 版本选 3.10 或 3.11。3.12 在部分 flash-attn 预编译轮子上会翻车,这是血泪经验。

conda create -n llama_factory python=3.10 -y conda activate llama_factory # 后续所有 pip 操作都在这个环境里

如果你要用 WebUI,还需要额外装gradio和streamlit,但训练本身不依赖它们。先把训练跑通,再装界面,能少一半报错。

2.3 显存不够时,先算账再选方案

LLaMA-Factory 支持 LoRA、QLoRA、全参。很多人一上来就想全参微调 7B,结果 24G 卡直接 OOM。一个粗略的显存估算表:

微调方式7B 模型显存需求说明
全参 + fp16约 80G 以上需要多卡或 A100
LoRA + fp16约 18-22G单张 3090/4090 可跑
QLoRA + 4bit约 10-14G单张 3080 10G 勉强
推理 only约 14G不训练只对话

这张表是经验值,实际还受 batch size、序列长度影响。如果你只有一张 12G 的卡,QLoRA 是唯一现实选择,别硬试全参。

3. 数据格式:LLaMA-Factory 认什么,你怎么喂

3.1 两种数据格式,选一种就别混

LLaMA-Factory 的data/目录下有一份dataset_info.json,里面注册了所有可用数据集。你自定义的数据要么走alpaca格式,要么走sharegpt格式。alpaca 适合单轮指令,sharegpt 适合多轮对话。

alpaca 格式长这样:

[ { "instruction": "把下面这句话翻译成英文", "input": "今天天气不错", "output": "The weather is nice today." } ]

sharegpt 格式长这样:

[ { "conversations": [ {"from": "human", "value": "你好,帮我写个快排"}, {"from": "gpt", "value": "好的,以下是 Python 实现..."} ] } ]

注意:from字段的值必须和dataset_info.json里配置的role_tag对应,默认是human和gpt。如果你写成user和assistant,训练时对话模板会匹配不上,loss 直接不降。

3.2 注册数据集:改 JSON 不是改代码

把数据文件放到data/下,然后在dataset_info.json里加一段:

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

参数说明:formatting决定用哪套模板,columns把你的字段名映射到框架内部字段。如果你的数据里没有input列,query可以留空字符串,但键要保留。改完不用重启,训练命令里dataset参数写my_dataset即可。

3.3 数据量少的时候,先做一遍 dry run

我一般会先用 100 条数据跑 10 步,确认 loss 在动、显存没爆、保存路径可写,再换全量数据。命令里加--max_samples 100和--max_steps 10,几分钟就能验证链路。

llamafactory-cli train \ --stage sft \ --do_train \ --model_name_or_path /path/to/base_model \ --dataset my_dataset \ --max_samples 100 \ --max_steps 10 \ --output_dir ./sft_dryrun \ --per_device_train_batch_size 1 \ --learning_rate 1e-4 \ --template default

--template要和基座模型匹配,Qwen 用qwen,Llama 用llama3,ChatGLM 用chatglm3。模板错了,模型学到的对话格式就是乱的。

4. 训练参数:LoRA 的 rank、alpha 和 target 怎么定

4.1 LoRA rank 不是越大越好

LoRA 的lora_rank默认 8,lora_alpha默认 16。rank 越大,可训练参数越多,显存和过拟合风险都上升。我的经验是:数据量小于 1 万条,rank 8 到 16 足够;数据量几万条以上,可以试 32 或 64。alpha 一般设成 rank 的两倍,或者等于 rank,两者比例影响更新幅度。

--lora_rank 16 \ --lora_alpha 32 \ --lora_dropout 0.05 \ --lora_target all

lora_target all表示对所有线性层加 LoRA。如果显存紧张,可以只加q_proj,v_proj,但效果会打折扣。lora_dropout在数据少时设 0.1,数据多时设 0.05 或 0。

4.2 学习率和 batch size 的联动

LLaMA-Factory 默认学习率 5e-5,这是全参微调的常用值。LoRA 通常需要更大学习率,1e-4 到 3e-4 比较常见。batch size 受显存限制,但可以用梯度累积模拟大 batch。

--per_device_train_batch_size 2 \ --gradient_accumulation_steps 8 \ --learning_rate 2e-4 \ --lr_scheduler_type cosine \ --warmup_ratio 0.1

等效 batch size = 2 × 8 × GPU 数。warmup_ratio 0.1 表示前 10% 步数线性升温,避免一开始就大步长震荡。cosine 调度在微调里比 linear 更稳。

4.3 精度选择:bf16、fp16 还是 fp32

--bf16 true # 算力 >= 8.0 且驱动支持时用 --fp16 true # 算力 < 8.0 时用,但需要 loss scaling

两者不能同时为 true。bf16 动态范围大,不容易溢出,优先选。如果卡不支持 bf16,用 fp16 时要留意 loss 是否出现 NaN,必要时加--fp16_full_eval或调小学习率。

5. 避坑与排查:那些让你怀疑人生的报错

5.1 现象:训练启动就报 KeyError: 'instruction'

原因:数据文件里字段名和dataset_info.json里columns映射不一致,或者 JSON 文件本身有语法错误,比如末尾多了逗号。解决:用python -m json.tool my_data.json先验证 JSON 合法性,再核对字段名。别用记事本改 JSON,用编辑器看括号配对。

5.2 现象:loss 一直是 0 或者不下降

原因:对话模板和基座模型不匹配,或者数据里 output 为空。解决:检查--template参数,Qwen 系列用qwen,Llama3 用llama3。再抽一条数据打印出来,确认 response 字段非空。如果用的是 sharegpt 格式,检查from字段值是否和dataset_info.json里的role_tag一致。

5.3 现象:CUDA out of memory,但显存看着还有余量

原因:PyTorch 缓存分配器碎片化,或者序列长度设太大。解决:加--per_device_train_batch_size 1和--gradient_checkpointing true,后者用时间换显存。还可以设--cutoff_len 512截断长序列。如果还不行,换 QLoRA,加--quantization_bit 4。

5.4 现象:保存的 LoRA 权重加载后推理没效果

原因:推理时没有合并 LoRA,或者 template 和训练时不一致。解决:推理命令里加--adapter_name_or_path ./sft_output,并保持--template和训练时相同。如果要用 vLLM 部署,需要先合并权重,LLaMA-Factory 提供了export命令。

5.5 现象:多卡训练时只有一张卡在跑

原因:没有用torchrun或accelerate launch启动,直接python跑只认单卡。解决:用accelerate config配好多卡,然后用accelerate launch启动训练脚本。或者用FORCE_TORCHRUN=1 llamafactory-cli train ...让框架自己拉起分布式。

6. 进阶技巧:用 WebUI 快速试参,用 CLI 固化流程

6.1 WebUI 适合找感觉,不适合复现

LLaMA-Factory 的 WebUI 启动命令是llamafactory-cli webui,打开后可以点选模型、数据集、LoRA 参数,点开始训练。它的价值在于快速试不同 rank 和 learning rate 的组合,但每次点选生成的参数不会自动保存成可复现的脚本。我的做法是:在 WebUI 里试出大致范围,然后把对应的 YAML 配置导出,用 CLI 跑最终训练。

# 导出 WebUI 里的配置为 yaml # 在 WebUI 界面点“导出配置”,保存为 train_config.yaml # 然后用 CLI 加载 llamafactory-cli train train_config.yaml

YAML 里可以写注释,比一长串命令行参数好维护。团队协作时,把 YAML 提交到 git,谁跑都用同一份配置。

6.2 用--plot_loss和日志判断是否过拟合

训练时加--plot_loss true,结束后会在输出目录生成training_loss.png。如果训练 loss 持续下降但验证 loss 开始上升,就是过拟合。这时候要么减 rank,要么加 dropout,要么早停。LLaMA-Factory 支持--eval_dataset和--eval_steps,别省这一步,否则你拿到的模型可能只是背下了训练集。

6.3 合并权重与量化导出

训练完的 LoRA 权重是分离的,部署前要合并:

llamafactory-cli export \ --model_name_or_path /path/to/base_model \ --adapter_name_or_path ./sft_output \ --template qwen \ --finetuning_type lora \ --export_dir ./merged_model \ --export_size 2 \ --export_legacy_format false

export_size是分片大小,2 表示 2GB 一片。合并后的模型可以直接用 transformers 加载,也可以用 vLLM 加速推理。如果显存不够,导出时加--export_quantization_bit 4生成 4bit 量化模型,但精度会掉一点,自己权衡。

6.4 一个我常犯的错:忘了清空输出目录

LLaMA-Factory 在output_dir已存在且非空时,默认会报错或覆盖。我习惯在训练脚本开头加一行rm -rf ./sft_output,但有一次手滑写成了rm -rf ./sft_output/,结果把上一轮最好的 checkpoint 删了。后来改成用时间戳命名输出目录,比如output_dir ./sft_$(date +%m%d_%H%M),既不会覆盖,也能追溯。这个习惯帮我省了至少两次后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 3:45:30

博客小程序+SSM从部署到二次开发:毕设源码核心逻辑与避坑指南

市面上关于“博客小程序 SSM”的代码和文档其实不少&#xff0c;但大多数要么只给源码不讲思路&#xff0c;要么文档写得像产品说明书&#xff0c;真正能让人照着做完、做完还能讲清楚原理的资料并不多见。我手上这套“weixin162博客小程序ssm(文档源码)_kaic”就是典型的毕设…

作者头像 李华
网站建设 2026/10/13 3:44:46

LeetCode两数相加:链表模拟竖式加法与进位处理全解析

先把结论放在前头&#xff1a;这道「两数相加」在 LeetCode 热题 100 里的出现频率非常高&#xff0c;但很多人第一反应是“把链表转成整数直接加”&#xff0c;写完一提交才发现溢出。它考的其实不是大数运算本身&#xff0c;而是你愿不愿意接受“链表的每一个节点只存一位数”…

作者头像 李华
网站建设 2026/10/13 3:44:37

Ubuntu旧版本安装Docker完整指南:20.04/18.04/16.04兼容性解析

做运维时间长了&#xff0c;你会发现最怕的不是新系统上的新功能&#xff0c;而是那些还在跑着老系统的机器。明明业务一直没迁移&#xff0c;安全补丁还得打&#xff0c;新组件还得装&#xff0c;偏偏环境又是 Ubuntu 20.04、18.04 这样的中老年系统。折腾 Docker 的时候&…

作者头像 李华
网站建设 2026/10/13 3:43:54

鸿蒙Flutter混合开发指南:从环境搭建到跑通首个页面

前阵子公司要启动鸿蒙版本&#xff0c;我翻了一圈资料&#xff0c;发现大部分教程都在讲 ArkTS 原生开发&#xff0c;可我们产品线过去两年一直用 Flutter 写跨端&#xff0c;代码和组件全在 Flutter 里。要是完全另起炉灶&#xff0c;用鸿蒙原生重写一遍&#xff0c;周期和人力…

作者头像 李华
网站建设 2026/10/13 3:43:54

用NodeXL做动态网络分析:从时间线到演化指标全流程

很多人做社会网络分析&#xff0c;第一步就是把边列表导入软件&#xff0c;出一张五颜六色的网络图&#xff0c;然后开始数节点、算密度、找社群。说实话&#xff0c;静态分析确实入门友好&#xff0c;但我自己在用 NodeXL 的过程中越来越觉得&#xff0c;如果数据里带着时间戳…

作者头像 李华
网站建设 2026/10/13 3:43:54

RouterOS WebFig汉化补丁:v7.9–v7.13内核级本地化方案

简介&#xff1a;本资源是专为中文网络管理员与RouterOS初学者设计的Web界面汉化补丁包&#xff0c;解决英文WebFig界面带来的理解与操作障碍&#xff0c;显著提升中文用户在企业级路由配置中的效率与体验。压缩包共4个文件&#xff08;257KB&#xff09;&#xff0c;含1个核心…

作者头像 李华