在AI大模型技术快速发展的今天,如何高效地进行模型微调以适应特定业务场景,成为许多开发者关注的重点。本文将围绕 Llama-Factory 这一高效微调框架,结合 Conda 和 Docker 环境配置,详细介绍从环境搭建到模型训练的全流程。更重要的是,博主将Llama-Factory如何应用到项目实战,通过具体代码示例,解析如何编码实现基于Llama-Factory的模型微调,废话不多说直接上干货。
1、采用conda环境进行微调
#克隆代码
git clone https://github.com/hiyouga/LLaMA-Factory.git
#创建conda环境
conda create -n llama_factory python=3.10
conda activate llama_factory
#安装LLaMA-Factory
cd LLaMA-Factory
pip install -e '.[torch,metrics]'
2、准备数据集
sed -i 's/{{name}}/Harriet/g' data/identity.json
sed -i 's/{{author}}/LLaMA Factory/g' data/identity.json
3、执行微调命令
3.1 llama模型微调
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /home/harriet/models/Meta-Llama-3-8B-Instruct \
--dataset identity \
--dataset_dir ./data \
--template llama3 \
--finetuning_type lora \
--output_dir ./saves/LLaMA3-8B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 50 \
--warmup_steps 20 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
3.2 deepseek模型微调
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /home/harriet/models/DeepSeek-R1-Distill-Qwen-7B \
--dataset alpaca_zh_demo,identity \
--dataset_dir ./data \
--template deepseekr1 \
--finetuning_type lora \
--output_dir ./saves/DeepSeek-7B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 50 \
--warmup_steps 20 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
3.3 千问模型微调
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /home/harriet/models/Qwen25-3B-Instruct \
--dataset identity \
--dataset_dir ./data \
--template qwen \
--finetuning_type lora \
--output_dir ./saves/Qwen25-3B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 50 \
--warmup_steps 20 \
--save_steps 100 \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
部分关键参数说明
model_name_or_path 需要微调的模型路径
template 模版,不同的模型模版不同,请参考
https://github.com/hiyouga/LLaMA-Factory?tab=readme-ov-file#supported-models 获取不同模型的模板定义。
stage 当前训练的阶段,枚举值,有“sft”,"pt","rm","ppo"等,代表了训练的不同阶段,这里我们是有监督指令微调,所以是sft
do_train 是否是训练模式
dataset 使用的数据集列表,所有字段都需要按上文在data_info.json里注册,多个数据集用","分隔
dataset_dir 数据集所在目录,这里是 data,也就是项目自带的data目录
finetuning_type 微调训练的类型,枚举值,有"lora","full","freeze"等,这里使用lora
output_dir 训练结果保存的位置
cutoff_len 训练数据集的长度截断
per_device_train_batch_size 每个设备上的batch size,最小是1,如果GPU 显存够大,可以适当增加
fp16 使用半精度混合精度训练
max_samples 每个数据集采样多少数据
val_size 随机从数据集中抽取多少比例的数据作为验证集
CUDA_VISIBLE_DEVICES 显卡,博主只有一张显卡,所以是0,如果是一张显卡这个参数可以不用写,默认是0。
看到以上图片,说明模型微调训练成功结束了。
4、通过web界面验证问答
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /home/harriet/models/DeepSeek-R1-Distill-Qwen-7B \
--adapter_name_or_path ./saves/DeepSeek-7B/lora/sft \
--template deepseekr1 \
--finetuning_type lora
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /home/harriet/models/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webchat \
--model_name_or_path /home/harriet/models/Qwen25-3B-Instruct \
--adapter_name_or_path ./saves/Qwen25-3B/lora/sft \
--template qwen \
--finetuning_type lora
5、通过命令行验证问答
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path /home/harriet/models/DeepSeek-R1-Distill-Qwen-7B \
--adapter_name_or_path ./saves/DeepSeek-7B/lora/sft \
--template deepseekr1 \
--finetuning_type lora
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path /home/harriet/models/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path /home/harriet/models/Qwen25-3B-Instruct \
--adapter_name_or_path ./saves/Qwen25-3B/lora/sft \
--template qwen \
--finetuning_type lora
6、LoRA模型合并导出
CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \
--model_name_or_path /media/harriet/models/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora \
--export_dir megred-model-path \
--export_size 2 \
--export_device cpu \
--export_legacy_format False
合并导出的模型可以采用vllm进行推理,具体如何采用vllm进行模型部署及推理,可参考博主的另外一篇文章《用RTX 3090显卡本地部署DeepSeek-R1模型》,至此通过conda+ Llama-Factory进行模型微调也就可以了。
7、通过docker如何进行模型微调
7.1 构建llamafactory镜像
docker build -f ./docker/docker-cuda/Dockerfile \
--build-arg INSTALL_BNB=false \
--build-arg INSTALL_VLLM=false \
--build-arg INSTALL_DEEPSPEED=false \
--build-arg INSTALL_FLASHATTN=false \
--build-arg PIP_INDEX=https://pypi.org/simple \
-t llamafactory:latest .
7.2 运行llamafactory容器
docker run -dit --gpus=all \
-v ./hf_cache:/root/.cache/huggingface \
-v ./ms_cache:/root/.cache/modelscope \
-v ./om_cache:/root/.cache/openmind \
-v ./data:/app/data \
-v ./output:/app/output \
-p 7860:7860 \
-p 8000:8000 \
--shm-size 16G \
--name llamafactory \
llamafactory:latest
容器运行之后可以进入容器执行3.1、3.2、3.3进行模型微调,也可以执行llamafactory-cli webui通过界面进行验证模型微调,端口就是启动容器时的7860端口,如下图所示:
通过界面微调模型后可以点击export界面进行模型合并并导出。至此通过docker+llamafactory进行模型微调也就成功了。
以上是可以通过技术验证,验证llama-factory模型微调训练的可行性,接下来才是干货中的干货,如果在实际应用中通过自己开发的界面,将参数传递给后台服务,然后进行微调,如果用官网提供的界面,参数实在太多,相关参数可以直接预制好,只要部分关键参数就可以了。
无非就是四个步骤,1、数据集准备,2、参数设置,3、模型训练,4、合并导出模型
Python最关键代码如下就一行:
1、更新数据集配置文件
data[file_name].update(info)
json.dump(data,open('data/dataset_info.json',mode='w'))
2、接受客户端模型训练参数并保存到json文件中
json.dump(args_json, open("train_model.json", "w", encoding="utf-8"), indent=2)
3、执行训练命令
os.system("llamafactory-cli train train_model.json")
4、合并模型并导出
os.system('llamafactory-cli export merge_model.json')
以上代码编写完成之后,可以通过Dockerfile再次构建一个镜像,基础镜像可以采用7.1章节构建的镜像作为基础镜像,至此在项目中如何实战,大概就是这么一个思路。