LLaMA Factory:让大模型微调变得更简单

405 阅读4分钟

引言

    在当今人工智能领域,大型语言模型(LLMs)已经展示了其在推理、问答、机器翻译等多种应用中的出色能力。随着越来越多的开放源代码语言模型的发布,如何在有限资源下高效地进行大规模语言模型的微调成为了研究和开发的关键问题。尤其是当涉及到数以百计的模型时,手动进行微调的复杂性和计算成本变得不可忽视。

    针对这一挑战,LLaMA-Factory应运而生,作为一个统一的框架,它将多种前沿的高效训练方法整合在一起,为用户提供了一个灵活且易于定制的微调平台。LLaMA-Factory不仅支持100多种大型语言模型的微调,而且简化微调流程,减少模型和数据集的依赖,并且支持多种高效的微调技术。

Part1 前期准备

软件依赖(推荐)

python==3.10  
torch==2.6.0  
transformers==4.50.0  
datasets==3.2.0  
accelerate==1.2.1
peft==0.15.1  
trl==0.9.6

下载安装

git clone --depth1 [项目地址](https://github.com/hiyouga/LLaMA-Factory.git)

conda create -n llama_factory python=3.10 

conda activate llama_factory 

cd LLaMA-Factorypip install -e '.[torch,metrics]'

Part2 数据准备

在"./data/dataset_info.json"中包含了所有可用的数据集,如果希望使用自己的数据集对模型进行微调,那么需要在"./data/dataset_info.json"文件中添加数据集描述,并通过修改“dataset:数据集名称”配置来使用数据集。目前来说,LLaMA-Factory支持alpaca格式和sharegpt格式的数据集。

以alpaca格式为例,整个数据集是一个json对象的列表,具体数据格式为:

[  

    {    

      "instruction": "用户指令(必填)",           "input": "用户输入(选填)",                   "output": "模型回答(必填)",                 "system": "系统提示词(选填)",              "history": [     

            ["第一轮指令(选填)", "第一轮回答(选填)"],      ["第二轮指令(选填)", "第二轮回答(选填)"]   

      ]  

     }

]

对于上述格式的数据,"./data/dataset_info.json"中的数据描述应为:

"数据集名称": {  

  "file_name": "data.json",  

  "columns": {   

      "prompt": "instruction",   

      "query": "input",   

      "response": "output",

      "system": "system", 

      "history": "history"  

      } 

}

复制该数据集到 data目录下,这样一来,我们用于大模型微调的数据集就已经构造完毕。此外,还可以构造预训练数据集、偏好数据集、多模态数据集等。

Part3 模型微调

LLaMA-Factory支持多种形式的微调,包括LoRA微调、QLoRA微调、全参数微调等。在此以LoRA微调为例进行说明。

首先将下载好的模型放置在"LLaMA-Factory"所在目录中。在"LLaMA-Factory/examples/train_lora/llama3_lora_sft.yaml"文件中,我们可以通过该配置文件修改具体的参数以实现微调。配置完该文件执行下面的命令以进行模型微调:

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml

或者我们也可以通过编写脚本,具体内容示例如下:

图片

其中model_name_or_path是我们预先下载好的模型权重所在的路径,output_dir为经过微调后适配器存放的位置,用于后续与原模型参数合并并进行推理。

Part4 模型推理

现在我们已经对模型进行了LoRA微调并存放了微调后的适配器参数,接下来就可以将该适配器参数与原模型进行合并从而进行模型推理。

用于推理的yaml文件位于"LLaMA-Factory/examples/inference/llama3_lora_sft.yaml"中。示例命令行参数如下:

CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \    

--model_name_or_path /Meta-Llama-3-8B-Instruct \    

--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft  \    

--template llama3 \    

--finetuning_type lora

其中model_name_or_path即为原始下载的模型路径,adapter_name_or_path即为上一步模型微调中的output_dir。

Part5 模型导出

经过模型微调以及推理后,我们可以将最终微调后的模型进行导出,yaml文件路径如下:"LLaMAFactory/examples/merge_lora/llama3_lora_sft.yaml"

示例命令行参数如下:

CUDA_VISIBLE_DEVICES=0 llamafactory-cli export \    

--model_name_or_path /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

至此,我们完成了从数据集构建、模型微调、模型推理、模型导出的流程。

参考资料:github.com/hiyouga/LLa…