git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factoryconda create -n llama-factory python=3.10 -y
conda activate llama-factory
pip install -e ".[torch,metrics,bitsandbytes,hqq,swanlab]" --index-url https://pypi.tuna.tsinghua.edu.cn/simple安装时的可选参数:
名称 | 描述 |
torch | 开源深度学习框架 PyTorch,广泛用于机器学习和人工智能研究中。 |
torch-npu | PyTorch 的昇腾设备兼容包。 |
metrics | 用于评估和监控机器学习模型性能。 |
deepspeed | 提供了分布式训练所需的零冗余优化器。 |
bitsandbytes | 用于大型语言模型量化。 |
hqq | 用于大型语言模型量化。 |
eetq | 用于大型语言模型量化。 |
gptq | 用于加载 GPTQ 量化模型。 |
awq | 用于加载 AWQ 量化模型。 |
aqlm | 用于加载 AQLM 量化模型。 |
vllm | 提供了高速并发的模型推理服务。 |
galore | 提供了高效全参微调算法。 |
badam | 提供了高效全参微调算法。 |
qwen | 提供了加载 Qwen v1 模型所需的包。 |
modelscope | 魔搭社区,提供了预训练模型和数据集的下载途径。 |
swanlab | 开源训练跟踪工具 SwanLab,用于记录与可视化训练过程 |
dev | 用于 LLaMA Factory 开发维护。 |
数据格式根据 LLaMAFactory 官方要求格式来准备,有专门将文档处理成指定格式的项目:Easy Dataset;具体使用方法推荐参考官方文档。最终导出 json 或 jsonl 文件。
数据文件准备好之后,将数据文件放到 LLaMA-Factory/data 路径下,并配置路径下的 LLaMA-Factory/data/dataset_info.json 文件,将新增的数据集添加进去:
{
"identity": {
"file_name": "identity.json"
},
"alpaca_en_demo": {
"file_name": "alpaca_en_demo.json"
},
"alpaca_zh_demo": {
"file_name": "alpaca_zh_demo.json"
},
"how_searchers_are_made": {
"file_name": "how_searchers_are_made.json"
},
……
}llamafactory-cli webui
# 指定设备启动
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli webui
/anjhon/Models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56设置好参数和模型之后就可以开始训练了。
在页面上配置导出路径,导出即可
名称 | 类型 | 介绍 |
| API | API 服务器监听的主机地址 |
| API | API 服务器监听的端口号 |
| API | 访问 API 的密码。 |
| API | 指定 API 服务要加载和使用的模型名称 |
| API | 控制 API 日志的详细程度 |
| API | 设置 FastAPI 应用的根路径 |
| API | API 的最大并发请求数。 |
| General | 是否禁用启动时的版本检查。 |
| General | 强制检查可选的导入 |
| General | 允许在命令行中传递额外参数 |
| General | 设置 LLaMA-Factory 的日志级别(“DEBUG”,”INFO”,”WARN”) |
| General | 优先使用 ModelScope 下载模型/数据集或使用缓存路径中的模型/数据集 |
| General | 优先使用 Openmind 下载模型/数据集或使用缓存路径中的模型/数据集 |
| General | 是否使用 Ray 进行分布式执行或任务管理。 |
| General | 是否记录 VRAM 使用情况。 |
| General | 是否表示启用特定的 PyTorch 优化。 |
| General | 是否为 NPU启用 JIT 编译。 |
| General | GPU 选择。 |
| General | NPU 选择。 |
| Torchrun | 是否强制使用 |
| Torchrun | Torchrun部署中主节点 (master node) 的网络地址 |
| Torchrun | Torchrun部署中主节点用于通信的端口号 |
| Torchrun | 参与分布式部署的总节点数量 |
| Torchrun | 当前节点在所有节点中的 rank,通常从 0 到 |
| Torchrun | 每个节点上的 GPU 数 |
| Log | 是否禁用 wandb |
| Log | 设置 wandb 中的项目名称。 |
| Log | 访问 wandb 的 api key |
| Web UI | 是否创建一个可共享的 webui 链接 |
| Web UI | 设置 Gradio 服务器 IP 地址(例如 |
| Web UI | 设置 Gradio 服务器的端口 |
| Web UI | 设置 Gradio 应用的根路径 |
| Web UI | 启用 Gradio 服务器的 IPv6 支持 |
| Setting | 支持使用 |
命令行微调相较于 webui 更自由、定制化程度更高
根据官方项目中提供的模板:LLaMA-Factory/examples/train_qlora/llama3_lora_sft_otfq.yaml 进行复制调整,最终调整如下:
### model
model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56
quantization_bit: 4 # choices: [8 (bnb/hqq/eetq), 4 (bnb/hqq), 3 (hqq), 2 (hqq)]
quantization_method: bnb # choices: [bnb, hqq, eetq]
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
### dataset
dataset: how_searchers_are_made
template: qwen3
cutoff_len: 2048
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
dataloader_num_workers: 4
### output
output_dir: saves/qwen3-14b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]
### train
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
bf16: true
ddp_timeout: 180000000
### eval
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500
启动命令
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yamlCUDA_VISIBLE_DEVICES:指定用来训练的 GPU,默认使用全部在启动命令后还可追加参数更新 yaml 文件中的参数:
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml learning_rate=1e-5 logging_steps=1更多可选参数如下(基本都是 .yaml 文件中有的参数):
名称 | 描述 |
model_name_or_path | 模型名称或路径 |
stage | 训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO |
do_train | true用于训练, false用于评估 |
finetuning_type | 微调方式。可选: freeze, lora, full |
lora_target | 采取LoRA方法的目标模块,默认值为 |
dataset | 使用的数据集,使用”,”分隔多个数据集 |
template | 数据集模板,请保证数据集模板与模型相对应。 |
output_dir | 输出路径 |
logging_steps | 日志输出步数间隔 |
save_steps | 模型断点保存间隔 |
overwrite_output_dir | 是否允许覆盖输出目录 |
per_device_train_batch_size | 每个设备上训练的批次大小 |
gradient_accumulation_steps | 梯度积累步数 |
max_grad_norm | 梯度裁剪阈值 |
learning_rate | 学习率 |
lr_scheduler_type | 学习率曲线,可选 |
num_train_epochs | 训练周期数 |
bf16 | 是否使用 bf16 格式 |
warmup_ratio | 学习率预热比例 |
warmup_steps | 学习率预热步数 |
push_to_hub | 是否推送模型到 Huggingface |
报错一:
OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
[rank0]: Traceback (most recent call last):
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module>
[rank0]: launch()
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch
[rank0]: run_exp()
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
[rank0]: _training_function(config={"args": args, "callbacks": callbacks})
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
[rank0]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft
[rank0]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset
[rank0]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset
[rank0]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset
[rank0]: dataset = load_dataset(
[rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset
[rank0]: builder_instance.download_and_prepare(
[rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare
[rank0]: raise OSError(
[rank0]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
[rank1]: Traceback (most recent call last):
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module>
[rank1]: launch()
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch
[rank1]: run_exp()
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
[rank1]: _training_function(config={"args": args, "callbacks": callbacks})
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
[rank1]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft
[rank1]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset
[rank1]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset
[rank1]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset
[rank1]: dataset = load_dataset(
[rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset
[rank1]: builder_instance.download_and_prepare(
[rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare
[rank1]: raise OSError(
[rank1]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)解决一:
日志中可以看出是在加载数据集的时候提示磁盘空间不足,但是明明使用的是已经下载好的模型和数据,而且检查当前路径下的可用空间是足够的;
在 github 仓库的 issue 中找到解决方法,在启动命令后面重新指定 cache_dir 即可(将 cache 路径指向 LLaMAFactory 路径下的 cache):
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml cache_dir="/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/cache"使用 llamafactory-cli chat inference_config.yaml 或 llamafactory-cli webchat inference_config.yaml 进行推理与模型对话。对话时配置文件只需指定原始模型 model_name_or_path 和 template ,并根据是否是微调模型指定 adapter_name_or_path 和 finetuning_type。
默认情况下,模型推理将使用 Huggingface 引擎。 也可以指定 infer_backend: vllm 以使用 vllm 推理引擎以获得更快的推理速度。
对于原始模型推理, inference_config.yaml 中 只需指定原始模型 model_name_or_path 和 template 即可。
### examples/inference/llama3.yaml
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
template: llama3
infer_backend: huggingface #choices: [huggingface, vllm]对于微调模型推理,除原始模型和模板外,还需要指定适配器路径 adapter_name_or_path 和微调类型 finetuning_type。
### examples/inference/llama3_lora_sft.yaml
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
infer_backend: huggingface #choices: [huggingface, vllm]对于多模态模型,可以运行以下指令进行推理。
llamafactory-cli webchat examples/inference/llava1_5.yamlexamples/inference/llava1_5.yaml 的配置示例如下:
model_name_or_path: llava-hf/llava-1.5-7b-hf
template: vicuna
infer_backend: huggingface #choices: [huggingface, vllm]为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型
通过 llamafactory-cli export merge_config.yaml 指令来合并模型。其中 merge_config.yaml 需要根据不同情况进行配置。examples/merge_lora/llama3_lora_sft.yaml 提供了合并时的配置示例。
### examples/merge_lora/llama3_lora_sft.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### export
export_dir: models/llama3_lora_sft
export_size: 2
export_device: cpu
export_legacy_format: falsemodel_name_or_path 需要存在且与 template 相对应。 adapter_name_or_path 需要与微调中的适配器输出路径 output_dir 相对应。在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。
量化(Quantization)通过数据精度压缩有效地减少了显存使用并加速推理。LLaMA-Factory 支持多种量化方法,包括:
GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。我们通过量化技术将高精度表示的预训练模型转换为低精度的模型,从而在避免过多损失模型性能的情况下减少显存占用并加速推理,我们希望低精度数据类型在有限的表示范围内尽可能地接近高精度数据类型的表示,因此我们需要指定量化位数export_quantization_bit 以及校准数据集 export_quantization_dataset。
### examples/merge_lora/llama3_gptq.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
template: llama3
### export
export_dir: models/llama3_gptq
export_quantization_bit: 4
export_quantization_dataset: data/c4_demo.json
export_size: 2
export_device: cpu
export_legacy_format: falseQLoRA 是一种在 4-bit 量化模型基础上使用 LoRA 方法进行训练的技术。它在极大地保持了模型性能的同时大幅减少了显存占用和推理时间。不要使用量化模型或设置量化位数 quantization_bit
### examples/merge_lora/llama3_q_lora.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### export
export_dir: models/llama3_lora_sft
export_size: 2
export_device: cpu
export_legacy_format: falsemodel_name_or_path: 预训练模型的名称或路径template: 模型模板export_dir: 导出路径export_quantization_bit: 量化位数export_quantization_dataset: 量化校准数据集export_size: 最大导出模型文件大小export_device: 导出设备export_legacy_format: 是否使用旧格式导出修改配置文件
### examples/train_lora/llama3_lora_eval.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft # 可选项
### method
finetuning_type: lora
### dataset
task: mmlu_test # mmlu_test, ceval_validation, cmmlu_test
template: fewshot
lang: en
n_shot: 5
### output
save_dir: saves/llama3-8b/lora/eval
### eval
batch_size: 4执行评估
llamafactory-cli eval examples/train_lora/llama3_lora_eval.yaml修改配置文件
### examples/extras/nlg_eval/llama3_lora_predict.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
### method
stage: sft
do_predict: true
finetuning_type: lora
### dataset
eval_dataset: identity,alpaca_en_demo
template: llama3
cutoff_len: 2048
max_samples: 50
overwrite_cache: true
preprocessing_num_workers: 16
### output
output_dir: saves/llama3-8b/lora/predict
overwrite_output_dir: true
### eval
per_device_eval_batch_size: 1
predict_with_generate: true
ddp_timeout: 180000000执行评估
llamafactory-cli train examples/extras/nlg_eval/llama3_lora_predict.yaml参数名称 | 类型 | 介绍 |
task | str | 评估任务的名称,可选项有 mmlu_test, ceval_validation, cmmlu_test |
task_dir | str | 包含评估数据集的文件夹路径,默认值为 |
batch_size | int | 每个GPU使用的批量大小,默认值为 |
seed | int | 用于数据加载器的随机种子,默认值为 |
lang | str | 评估使用的语言,可选值为 |
n_shot | int | few-shot 的示例数量,默认值为 |
save_dir | str | 保存评估结果的路径,默认值为 |
download_modes | str | 评估数据集的下载模式,默认值为 |
根据合并配置样例文件:LLaMA-Factory/examples/merge_lora/llama3_lora_sft.yaml 进行修改:
### Note: DO NOT use quantized model or quantization_bit when merging lora adapters
### model
model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56
adapter_name_or_path: saves/qwen3-14b/lora/sft
template: qwen3
trust_remote_code: true
### export
export_dir: output/qwen3-14b_sft
export_size: 5
export_device: cpu # choices: [cpu, auto]
export_legacy_format: falsemodel_name_or_path:基座模型路径adapter_name_or_path:微调后的保存路径(与训练配置文件中保持一致)template: 模型模板export_dir: 合并后的导出路径export_quantization_bit: 量化位数export_quantization_dataset: 量化校准数据集export_size: 最大导出模型文件大小export_device: 导出设备export_legacy_format: 是否使用旧格式导出llamafactory-cli export examples/merge_lora/qwen3_14_lora_sft.yamlgit clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factoryconda create -n llama-factory python=3.10 -y
conda activate llama-factory
pip install -e ".[torch,metrics,bitsandbytes,hqq,swanlab]" --index-url https://pypi.tuna.tsinghua.edu.cn/simple安装时的可选参数:
名称 | 描述 |
torch | 开源深度学习框架 PyTorch,广泛用于机器学习和人工智能研究中。 |
torch-npu | PyTorch 的昇腾设备兼容包。 |
metrics | 用于评估和监控机器学习模型性能。 |
deepspeed | 提供了分布式训练所需的零冗余优化器。 |
bitsandbytes | 用于大型语言模型量化。 |
hqq | 用于大型语言模型量化。 |
eetq | 用于大型语言模型量化。 |
gptq | 用于加载 GPTQ 量化模型。 |
awq | 用于加载 AWQ 量化模型。 |
aqlm | 用于加载 AQLM 量化模型。 |
vllm | 提供了高速并发的模型推理服务。 |
galore | 提供了高效全参微调算法。 |
badam | 提供了高效全参微调算法。 |
qwen | 提供了加载 Qwen v1 模型所需的包。 |
modelscope | 魔搭社区,提供了预训练模型和数据集的下载途径。 |
swanlab | 开源训练跟踪工具 SwanLab,用于记录与可视化训练过程 |
dev | 用于 LLaMA Factory 开发维护。 |
数据格式根据 LLaMAFactory 官方要求格式来准备,有专门将文档处理成指定格式的项目:Easy Dataset;具体使用方法推荐参考官方文档。最终导出 json 或 jsonl 文件。
数据文件准备好之后,将数据文件放到 LLaMA-Factory/data 路径下,并配置路径下的 LLaMA-Factory/data/dataset_info.json 文件,将新增的数据集添加进去:
{
"identity": {
"file_name": "identity.json"
},
"alpaca_en_demo": {
"file_name": "alpaca_en_demo.json"
},
"alpaca_zh_demo": {
"file_name": "alpaca_zh_demo.json"
},
"how_searchers_are_made": {
"file_name": "how_searchers_are_made.json"
},
……
}llamafactory-cli webui
# 指定设备启动
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli webui
/anjhon/Models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56设置好参数和模型之后就可以开始训练了。
在页面上配置导出路径,导出即可
名称 | 类型 | 介绍 |
| API | API 服务器监听的主机地址 |
| API | API 服务器监听的端口号 |
| API | 访问 API 的密码。 |
| API | 指定 API 服务要加载和使用的模型名称 |
| API | 控制 API 日志的详细程度 |
| API | 设置 FastAPI 应用的根路径 |
| API | API 的最大并发请求数。 |
| General | 是否禁用启动时的版本检查。 |
| General | 强制检查可选的导入 |
| General | 允许在命令行中传递额外参数 |
| General | 设置 LLaMA-Factory 的日志级别(“DEBUG”,”INFO”,”WARN”) |
| General | 优先使用 ModelScope 下载模型/数据集或使用缓存路径中的模型/数据集 |
| General | 优先使用 Openmind 下载模型/数据集或使用缓存路径中的模型/数据集 |
| General | 是否使用 Ray 进行分布式执行或任务管理。 |
| General | 是否记录 VRAM 使用情况。 |
| General | 是否表示启用特定的 PyTorch 优化。 |
| General | 是否为 NPU启用 JIT 编译。 |
| General | GPU 选择。 |
| General | NPU 选择。 |
| Torchrun | 是否强制使用 |
| Torchrun | Torchrun部署中主节点 (master node) 的网络地址 |
| Torchrun | Torchrun部署中主节点用于通信的端口号 |
| Torchrun | 参与分布式部署的总节点数量 |
| Torchrun | 当前节点在所有节点中的 rank,通常从 0 到 |
| Torchrun | 每个节点上的 GPU 数 |
| Log | 是否禁用 wandb |
| Log | 设置 wandb 中的项目名称。 |
| Log | 访问 wandb 的 api key |
| Web UI | 是否创建一个可共享的 webui 链接 |
| Web UI | 设置 Gradio 服务器 IP 地址(例如 |
| Web UI | 设置 Gradio 服务器的端口 |
| Web UI | 设置 Gradio 应用的根路径 |
| Web UI | 启用 Gradio 服务器的 IPv6 支持 |
| Setting | 支持使用 |
命令行微调相较于 webui 更自由、定制化程度更高
根据官方项目中提供的模板:LLaMA-Factory/examples/train_qlora/llama3_lora_sft_otfq.yaml 进行复制调整,最终调整如下:
### model
model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56
quantization_bit: 4 # choices: [8 (bnb/hqq/eetq), 4 (bnb/hqq), 3 (hqq), 2 (hqq)]
quantization_method: bnb # choices: [bnb, hqq, eetq]
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all
### dataset
dataset: how_searchers_are_made
template: qwen3
cutoff_len: 2048
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
dataloader_num_workers: 4
### output
output_dir: saves/qwen3-14b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]
### train
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
bf16: true
ddp_timeout: 180000000
### eval
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500
启动命令
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yamlCUDA_VISIBLE_DEVICES:指定用来训练的 GPU,默认使用全部在启动命令后还可追加参数更新 yaml 文件中的参数:
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml learning_rate=1e-5 logging_steps=1更多可选参数如下(基本都是 .yaml 文件中有的参数):
名称 | 描述 |
model_name_or_path | 模型名称或路径 |
stage | 训练阶段,可选: rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO |
do_train | true用于训练, false用于评估 |
finetuning_type | 微调方式。可选: freeze, lora, full |
lora_target | 采取LoRA方法的目标模块,默认值为 |
dataset | 使用的数据集,使用”,”分隔多个数据集 |
template | 数据集模板,请保证数据集模板与模型相对应。 |
output_dir | 输出路径 |
logging_steps | 日志输出步数间隔 |
save_steps | 模型断点保存间隔 |
overwrite_output_dir | 是否允许覆盖输出目录 |
per_device_train_batch_size | 每个设备上训练的批次大小 |
gradient_accumulation_steps | 梯度积累步数 |
max_grad_norm | 梯度裁剪阈值 |
learning_rate | 学习率 |
lr_scheduler_type | 学习率曲线,可选 |
num_train_epochs | 训练周期数 |
bf16 | 是否使用 bf16 格式 |
warmup_ratio | 学习率预热比例 |
warmup_steps | 学习率预热步数 |
push_to_hub | 是否推送模型到 Huggingface |
报错一:
OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
[rank0]: Traceback (most recent call last):
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module>
[rank0]: launch()
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch
[rank0]: run_exp()
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
[rank0]: _training_function(config={"args": args, "callbacks": callbacks})
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
[rank0]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft
[rank0]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset
[rank0]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset
[rank0]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args)
[rank0]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset
[rank0]: dataset = load_dataset(
[rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset
[rank0]: builder_instance.download_and_prepare(
[rank0]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare
[rank0]: raise OSError(
[rank0]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)
[rank1]: Traceback (most recent call last):
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module>
[rank1]: launch()
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/launcher.py", line 19, in launch
[rank1]: run_exp()
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
[rank1]: _training_function(config={"args": args, "callbacks": callbacks})
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
[rank1]: run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 51, in run_sft
[rank1]: dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 304, in get_dataset
[rank1]: dataset = _get_merged_dataset(data_args.dataset, model_args, data_args, training_args, stage)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 182, in _get_merged_dataset
[rank1]: datasets[dataset_name] = _load_single_dataset(dataset_attr, model_args, data_args, training_args)
[rank1]: File "/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/src/llamafactory/data/loader.py", line 131, in _load_single_dataset
[rank1]: dataset = load_dataset(
[rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/load.py", line 2084, in load_dataset
[rank1]: builder_instance.download_and_prepare(
[rank1]: File "/root/miniconda3/envs/llafat/lib/python3.10/site-packages/datasets/builder.py", line 876, in download_and_prepare
[rank1]: raise OSError(
[rank1]: OSError: Not enough disk space. Needed: Unknown size (download: Unknown size, generated: Unknown size, post-processed: Unknown size)解决一:
日志中可以看出是在加载数据集的时候提示磁盘空间不足,但是明明使用的是已经下载好的模型和数据,而且检查当前路径下的可用空间是足够的;
在 github 仓库的 issue 中找到解决方法,在启动命令后面重新指定 cache_dir 即可(将 cache 路径指向 LLaMAFactory 路径下的 cache):
CUDA_VISIBLE_DEVICES=0,2 llamafactory-cli train examples/train_qlora/qwen3_14_lora_sft_otfq.yaml cache_dir="/nfsdata/DataSynthesis_/llafat/LLaMA-Factory/cache"使用 llamafactory-cli chat inference_config.yaml 或 llamafactory-cli webchat inference_config.yaml 进行推理与模型对话。对话时配置文件只需指定原始模型 model_name_or_path 和 template ,并根据是否是微调模型指定 adapter_name_or_path 和 finetuning_type。
默认情况下,模型推理将使用 Huggingface 引擎。 也可以指定 infer_backend: vllm 以使用 vllm 推理引擎以获得更快的推理速度。
对于原始模型推理, inference_config.yaml 中 只需指定原始模型 model_name_or_path 和 template 即可。
### examples/inference/llama3.yaml
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
template: llama3
infer_backend: huggingface #choices: [huggingface, vllm]对于微调模型推理,除原始模型和模板外,还需要指定适配器路径 adapter_name_or_path 和微调类型 finetuning_type。
### examples/inference/llama3_lora_sft.yaml
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
infer_backend: huggingface #choices: [huggingface, vllm]对于多模态模型,可以运行以下指令进行推理。
llamafactory-cli webchat examples/inference/llava1_5.yamlexamples/inference/llava1_5.yaml 的配置示例如下:
model_name_or_path: llava-hf/llava-1.5-7b-hf
template: vicuna
infer_backend: huggingface #choices: [huggingface, vllm]为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型
通过 llamafactory-cli export merge_config.yaml 指令来合并模型。其中 merge_config.yaml 需要根据不同情况进行配置。examples/merge_lora/llama3_lora_sft.yaml 提供了合并时的配置示例。
### examples/merge_lora/llama3_lora_sft.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### export
export_dir: models/llama3_lora_sft
export_size: 2
export_device: cpu
export_legacy_format: falsemodel_name_or_path 需要存在且与 template 相对应。 adapter_name_or_path 需要与微调中的适配器输出路径 output_dir 相对应。在完成模型合并并获得完整模型后,为了优化部署效果,人们通常会基于显存占用、使用成本和推理速度等因素,选择通过量化技术对模型进行压缩,从而实现更高效的部署。
量化(Quantization)通过数据精度压缩有效地减少了显存使用并加速推理。LLaMA-Factory 支持多种量化方法,包括:
GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。我们通过量化技术将高精度表示的预训练模型转换为低精度的模型,从而在避免过多损失模型性能的情况下减少显存占用并加速推理,我们希望低精度数据类型在有限的表示范围内尽可能地接近高精度数据类型的表示,因此我们需要指定量化位数export_quantization_bit 以及校准数据集 export_quantization_dataset。
### examples/merge_lora/llama3_gptq.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
template: llama3
### export
export_dir: models/llama3_gptq
export_quantization_bit: 4
export_quantization_dataset: data/c4_demo.json
export_size: 2
export_device: cpu
export_legacy_format: falseQLoRA 是一种在 4-bit 量化模型基础上使用 LoRA 方法进行训练的技术。它在极大地保持了模型性能的同时大幅减少了显存占用和推理时间。不要使用量化模型或设置量化位数 quantization_bit
### examples/merge_lora/llama3_q_lora.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### export
export_dir: models/llama3_lora_sft
export_size: 2
export_device: cpu
export_legacy_format: falsemodel_name_or_path: 预训练模型的名称或路径template: 模型模板export_dir: 导出路径export_quantization_bit: 量化位数export_quantization_dataset: 量化校准数据集export_size: 最大导出模型文件大小export_device: 导出设备export_legacy_format: 是否使用旧格式导出修改配置文件
### examples/train_lora/llama3_lora_eval.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft # 可选项
### method
finetuning_type: lora
### dataset
task: mmlu_test # mmlu_test, ceval_validation, cmmlu_test
template: fewshot
lang: en
n_shot: 5
### output
save_dir: saves/llama3-8b/lora/eval
### eval
batch_size: 4执行评估
llamafactory-cli eval examples/train_lora/llama3_lora_eval.yaml修改配置文件
### examples/extras/nlg_eval/llama3_lora_predict.yaml
### model
model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
### method
stage: sft
do_predict: true
finetuning_type: lora
### dataset
eval_dataset: identity,alpaca_en_demo
template: llama3
cutoff_len: 2048
max_samples: 50
overwrite_cache: true
preprocessing_num_workers: 16
### output
output_dir: saves/llama3-8b/lora/predict
overwrite_output_dir: true
### eval
per_device_eval_batch_size: 1
predict_with_generate: true
ddp_timeout: 180000000执行评估
llamafactory-cli train examples/extras/nlg_eval/llama3_lora_predict.yaml参数名称 | 类型 | 介绍 |
task | str | 评估任务的名称,可选项有 mmlu_test, ceval_validation, cmmlu_test |
task_dir | str | 包含评估数据集的文件夹路径,默认值为 |
batch_size | int | 每个GPU使用的批量大小,默认值为 |
seed | int | 用于数据加载器的随机种子,默认值为 |
lang | str | 评估使用的语言,可选值为 |
n_shot | int | few-shot 的示例数量,默认值为 |
save_dir | str | 保存评估结果的路径,默认值为 |
download_modes | str | 评估数据集的下载模式,默认值为 |
根据合并配置样例文件:LLaMA-Factory/examples/merge_lora/llama3_lora_sft.yaml 进行修改:
### Note: DO NOT use quantized model or quantization_bit when merging lora adapters
### model
model_name_or_path: /anjhon/LLaMA-Factory/models/hub/models--Qwen--Qwen3-14B/snapshots/8268fe3026cb304910457689366670e803a6fd56
adapter_name_or_path: saves/qwen3-14b/lora/sft
template: qwen3
trust_remote_code: true
### export
export_dir: output/qwen3-14b_sft
export_size: 5
export_device: cpu # choices: [cpu, auto]
export_legacy_format: falsemodel_name_or_path:基座模型路径adapter_name_or_path:微调后的保存路径(与训练配置文件中保持一致)template: 模型模板export_dir: 合并后的导出路径export_quantization_bit: 量化位数export_quantization_dataset: 量化校准数据集export_size: 最大导出模型文件大小export_device: 导出设备export_legacy_format: 是否使用旧格式导出llamafactory-cli export examples/merge_lora/qwen3_14_lora_sft.yaml