泽兴芝士网

一站式 IT 编程学习资源平台

Llama-Factory微调:编码实现与实战

在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章节构建的镜像作为基础镜像,至此在项目中如何实战,大概就是这么一个思路。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言