引言
在人工智能领域,大模型微调是一个热门话题,尤其是在自然语言处理(NLP)领域。本文将介绍大模型中的 instruct、chat 和 base 模型的不同点,探讨常见的微调框架,并详细介绍使用 LLaMA-Factory 进行微调的步骤。
本文详细介绍了如何使用 LLaMA-Factory 框架对大语言模型进行 LoRA 微调。内容涵盖 Base、Chat、Instruct 模型的区别,环境配置步骤,模型下载方法,以及基于 identity.json 数据集的自定义微调流程。文章提供了完整的命令行操作示例,包括推理测试、训练参数详解及结果验证,并补充了显存优化与常见问题排查方案,适合希望掌握大模型微调技术的开发者参考。

在人工智能领域,大模型微调是一个热门话题,尤其是在自然语言处理(NLP)领域。本文将介绍大模型中的 instruct、chat 和 base 模型的不同点,探讨常见的微调框架,并详细介绍使用 LLaMA-Factory 进行微调的步骤。
Base 模型,也称为基座模型,是在大量无标注数据上进行预训练的模型,学习到广泛的语言特征。这些模型具有大规模预训练、泛化能力强和可微调性等特点。
Chat 模型专为处理人机交互而设计,能够理解上下文,维持对话历史,生成连贯且情境相关的响应。这类模型的特点是上下文感知、互动性和创意生成。ChatGPT 就是一个典型的 chat 模型。
Instruct 模型是为遵循指令或完成特定任务而设计和优化的模型。它们经过指令数据集微调,能够更好地理解和执行用户提供的指令。
在微调大模型时,有多种框架可供选择。以下是一些常见的微调框架:
本文选择使用的微调框架是 LLaMA-Factory,这是一个开源的低代码大模型训练框架,专为大型语言模型(LLMs)的微调而设计。它具有高效且低成本、易于访问和使用、丰富的数据集选项、多样化的算法支持等特点。
首先,需要确定一下显卡驱动和 CUDA是否已安装完成。如果有同学确实是不会安装,建议查阅相关教程。可以使用以下命令进行一个简单的校验:
nvidia-smi
会出现如下输出,显示 GPU 的当前状况与一些配置信息。
现在我们需要下载本次微调所使用到的开源项目。
git clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory此时假设你已经完成了上述两种判断,并且根据自己的情况进行了相应的操作。那么接下来可以使用该命令进行相关环境依赖的安装:pip install -e '.[torch,metrics]' --user。–user这个可加可不加,如果你拥有你开发环境的 root 权限,那就可以考虑不加。但是如果你是像我一样在云端平台进行操作的,那还是加上比较好。
执行完上面三步后,再使用如下命令进行一个校验:
import torch
torch.cuda.current_device()
torch.cuda.get_device_name(0)
torch.__version__
若过程中未出现报错,并且输出结果正常,那么便算通过。
至此,基本的开发环境已经搭建完成。
下载模型方法有很多种。国内的小伙伴可以使用 ModelScope 的命令进行下载。不过在使用这个命令下载之前,各位还需要请确保 lfs 已经被正确安装:
git lfs install
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B-Instruct.git
这个命令会去 魔塔社区 下载 Meta-Llama-3-8B-Instruct 模型。在这里不给出 huggingface 相关下载方式了,相信你有能力访问它,就有能力去下载。如果你觉着自己的硬件不太行,那么咱可以用这个命令下载一个小一些的模型:
git clone https://www.modelscope.cn/Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8.git
该命令会下载 Qwen2.5-3B-Instruct-GPTQ-Int8 模型,这个比上面那个 8B 的小多了。如果用这俩命令无法下载模型,那你可能是因为 lfs 没有正确安装。此时比较好的方法是在网上搜寻相关教程进行安装,如果懒得装,也可以考虑使用下面这两种方法:
使用命令行下载
pip install modelscopemodelscope download --model Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8 安装 QWEN 模型,同理 Llama 模型也可以这么安装。使用 SDK 下载
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-3B-Instruct-GPTQ-Int8')
下载完后记得检查一下模型下载是否完整,可以进入对应文件目录用 du -sh * 看一看。
我们先试一试不进行微调,直接用刚刚下载的模型进行推理会是什么结果,在终端输入如下命令。(这个命令比较有讲究,各位最好去仔细读一读):
llamafactory-cli chat \
--model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
--template llama3
所有功能的入口全都是 llamafactory-cli,然后根据你的不同要求,增减不同的参数,下面是部分命令表格(详细参数和教程可以查阅官方文档):
| 参数名称 | 功能描述 |
|---|---|
| model_name_or_path | 指定使用的模型名称或模型文件的路径。 |
| chat | 启用命令行模式,允许用户通过命令行接口与模型交互。 |
| webui | 启用 Web 界面模式,提供图形用户界面以方便用户操作。 |
| finetuning_type | 选择微调方式,可选值为 freeze(冻结参数)、lora(LoRA 方法)和 full(全参数微调)。 |
| lora_target | 设置采用 LoRA 方法的目标模块,如果未指定,则默认作用于所有模块(all)。 |
| dataset | 指定使用的数据集,多个数据集可以用逗号','分隔。 |
| template | 指定数据集模板,确保所选模板与模型兼容。 |
| output_dir | 指定输出目录,用于保存训练结果和其他输出文件。 |
执行上述命令后,经过一系列的模型加载,最终会在终端出现信息。如果将命令中的 llamafactory-cli chat改成 llamafactory-cli webchat,那么就会有一个基于 gradio 开发的 ChatBot 推理页面,也就是所谓的网页版本。如果你是在本地进行部署,那么可以尝试使用 webchat,运行完后在终端可以看见对应的链接,点击或者复制再粘贴到浏览器打开即可。
目前 LLaMA-Factory 支持 JSON 格式的数据集。在这次微调训练中,我们使用 JSON 格式。这种 json 类型的训练数据格式如下:
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)"
}
本次教程我们简单对大模型的自我认知进行一个微调,我们可以在 LLaMA-Factory 文件目录下的 data 文件目录中找到 identity.json 文件,这个是系统自带的数据集 (已经默认在 LLaMA-Factory/data/dataset_info.json 注册为 identity)。
接下来我们进行一个文本替换:
如果是 Windows 用户,那么你需要手动使用编辑器打开 identity.json 文件,然后找到替换其中的 NAME 和 AUTHOR。
如果是 Linux 用户,那么可以使用 sed 完成快速替换:
sed -i 's/{{name}}/刚刚微调出来的模型/g' data/identity.json
sed -i 's/{{author}}/开发者/g' data/identity.json
替换前:
{
"instruction": "Who are you?",
"input": "",
"output": "Hello! I am {{name}}, an AI assistant developed by {{author}}. How can you assist you today?"
}
替换后:
{
"instruction": "Who are you?",
"input": "",
"output": "Hello! I am 刚刚微调出来的模型,an AI assistant developed by 开发者。How can you assist you today?"
}
至此,微调之前的准备工作都已经做完了。
在构建微调数据集的时候已经说明了,本次是使用指令监督微调,然后为了尽量减少对硬件的要求,咱们用的是 LoRA。在终端输入:
llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /path/to/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 \
--eval_steps 50 \
--evaluation_strategy steps \
--load_best_model_at_end \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
| 参数名称 | 功能描述 |
|---|---|
| stage | 表示当前训练阶段的枚举值,包括 sft(有监督指令微调)、pt、rm、ppo 等。在我们的案例中,我们关注的是有监督指令微调阶段,即 sft。 |
| do_train | 指示是否处于训练模式。 |
| dataset | 指定使用的数据集列表,所有数据集必须在 data_info.json 中注册,多个数据集以逗号','分隔。本次微调仅使用了 identity.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 | 指定从数据集中随机抽取的比例,用作验证集。 |
特别注意 V100 无法支持 bf16,望周知。
终端输出下面信息即代表微调结束。从结果来看,微调是成功的。关键指标如下:
当训练结束后,咱可以进行一下验证,在终端输入:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli chat \
--model_name_or_path /path/to/Meta-Llama-3-8B-Instruct \
--adapter_name_or_path ./saves/LLaMA3-8B/lora/sft \
--template llama3 \
--finetuning_type lora
接下来各位同学可以查看下微调后的效果。微调后的模型应该能识别出新的身份信息。
如果在训练过程中遇到显存不足的问题,可以尝试以下调整:
per_device_train_batch_size。gradient_accumulation_steps。cutoff_len 是否过大,适当降低序列长度。此外,确保 --fp16 参数与你的显卡架构兼容,部分旧架构可能不支持,需改用 bf16 或 fp32。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online