鼠扑 发表于 2025-3-14 23:18:09

【大模型】LLaMA-Factory的环境设置、微调模型与测试

媒介

【一些闲扯】
时常和朋友闲聊,时代发展这么快,在时代的洪流下,我们个人能捉住些什么呢。我问了大模型,文心一言是这样答复的:


[*]在快速发展的时代背景下,个人确实面对着诸多挑战,但同时也布满了机会。尽管时代洪流滚滚向前,我们依然可以捉住一些关键要素,以实现个人成长和代价提拔…(一些建议)… 记着,每个人的成长路径都是独一无二的,找到得当自己的方式并坚持下去才是最重要的。

哈哈跟没答复一样,毕竟是一个开放命题,还是要落到个人的行动上的。
先动起来吧,我的大模型的记录终于开始了。接下来将会做的事变:

[*]将transfomer、GPT系列、Bert等论文举行下论文阅读、解析记录。
[*]大模型相干的框架、库的使用,工程相干的知识体系。
[*]高star的开源工程的环境设置与运行。

自主相识和记录会按照上面的顺序。而现实实行时受项目必要,顺序会换一换。
【日常常用大模型】
别的,自己日常工作中,常用的大模型有通义千问、文心一言、Kimi。以下的纯个人使用感受:


[*]通义千问:在提问技术问题时,会直接对问题睁开表明息争决办法、大概实现对应的代码片段,其变量定名很精准。在代码类问题上使用感受较好。个人最常用。
[*]文心一言:提问技术问题时,总以为会有前摇,固然答复得核心问题也是OK的。对非技术的问题的答复,用词更丰富些。
[*]Kimi:最大的好处是会联网搜刮当下新的技术知识。别的对文档内容的提取能力很优秀。

个人在界面上比力倾向通义千问。
在现实使用上,必要编写文档和生动的文词,使用文心一言;问代码工程类问题,选择通义千问;当通义千问答复不出来时间,就找Kimi了。固然无论哪个模型答复的代码或文本,是要抱有怀疑值,是要阅读和验证的,因为偶然大模型真的会一本正经的乱说。
【大模型问答示例】


[*]文心一言
https://i-blog.csdnimg.cn/direct/f0ea3fb3c6cb499abce5d47d7c6d704f.png#pic_center
[*]通义千问
https://i-blog.csdnimg.cn/direct/99959696293241e7af7d9507a27b1435.png#pic_centerhttps://i-blog.csdnimg.cn/direct/4a8dc188a8f84c928887b6b342cf6334.png#pic_center
[*]Kimi
https://i-blog.csdnimg.cn/direct/f05b1dbc4f3f4cfd80a2829f26c60c01.png#pic_center
    OK,前面讲了一堆,接下来进入正题:大模型的微调工程-——LLaMA-Factory。
1 工程介绍



[*]作者: LLaMa Factory 的团队负责人是郑耀威,北京航空航天大学的博士生。
[*]论文链接:http://arxiv.org/pdf/2403.13372
[*]github链接:https://github.com/hiyouga/LLaMA-Factory
[*]具体功能:LLaMA-Factory是一个开源的大型语言模型(LLM)微调框架,旨在帮助开发者高效地微调和部署大型语言模型。
[*]项目布局:LLaMA-Factory 的项目布局通常包罗以下几个部门:

[*]模型库:包含支持的预训练模型。
微调方法:包含不同的微调技术实现。
数据集:提供或支持多种数据集,用于微调。
训练和评估:提供训练和评估模型的脚本和工具。
推理接口:提供模型推理的接口和工具。

https://i-blog.csdnimg.cn/direct/e45625212d8748d2adb626a2cbda3f72.png#pic_center
    2 环境设置

2.1 硬件与环境



[*]显卡型号:建议不低于3090,显存尽量24G+。这样可以训练比力主流的入门级别大模型 7B左右的版本。
https://i-blog.csdnimg.cn/direct/79fed555bf604543b23562fa96d0c44d.png#pic_center
[*]CUDA版本,保举使用12.2。查看自己的设备中的cuda版本的命令 nvidia-smi
https://i-blog.csdnimg.cn/direct/a31f7c3e60514839b30c52e606c6b4d0.png#pic_center
2.2 运行环境设置



[*]终端键入如下命令## 创建虚拟环境
conda create -n llama_factory python=3.11 -c conda-forge
## 激活虚拟环境
conda activate llama_factory
## 环境安装
pip install -e "."
## 这里我从modelscope下载模型,所以要进行库的安装
pip install modelscope -U

[*]环境安装竣事后,查看版本信息llamafactory-cli version

https://i-blog.csdnimg.cn/direct/d13d18c3f1d8450483f5daebe2259d70.png#pic_center


[*]查看gpu是否能被调用起来python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

https://i-blog.csdnimg.cn/direct/83496dd86c5244f38a37e1a460a6f689.png#pic_center
上面的内容都正确运行竣事后,说明环境设置已经完成。
    3 LLaMa Factory 微调模型(使用web方式)

3.1 界面开启


[*]设置使用modelscope下载模型,终端键入内容如下。也可在工程中 .env.local 文件中设置。export USE_MODELSCOPE_HUB=1

[*]下载的大模型,一般都是几个G左右,所以下载的路径尽量不要放在系统盘,优先选择挂载的数据盘。所以就必要设置下对应的路径,终端键入内容如下,后面的路径根据自己现实情况更换。export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"

[*]开启web界面llamafactory-cli webui

方便起见,上面的命令可以写在一个bash文件中。具体的,在根目录创建个 run_with_webui.sh,内里的内容为如下。固然也可以将其设置的系统环境变量当中,这里使用临时方式。
export USE_MODELSCOPE_HUB=1
# 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
llamafactory-cli webui
运行竣事后,在浏览器的http://localhost:7860/中可以打开大模型训练界面。WebUI 主要分为四个界面:训练、评估与预测、对话、导出。
3.2 模型微调训练

在开始训练模型之前,必要指定的参数有:

[*]模型名称及路径
[*]微调方法
[*]训练数据集
[*]学习率、训练轮数等训练参数
[*]微调参数等其他参数
[*]输出目录及设置路径

尝试如下图,设置好后开启训练。
若必要量化,在【量化品级】中,选择对应的数值即可,量化会带来精度损失,但显存占用会低落。
https://i-blog.csdnimg.cn/direct/f939fbb249624b2191950abf80c3fbdc.png#pic_centerhttps://i-blog.csdnimg.cn/direct/9e4a479e7d1c4dfc816326aaca99742d.png#pic_center
第一次调用会耗费些时间,下载模型和数据(可在终端的打印的信息查看进度)。
运行时可能会报错:


[*]若存在库缺失,pip安装即可;
[*]可能报错,说modelscope和datasets的库不兼容,安装兼容版本即可。个人使用可运行版本如下
https://i-blog.csdnimg.cn/direct/b5ec27e9ca194f779ddbc8b8dce373fd.png#pic_center
训练竣事后界面显示如下:
https://i-blog.csdnimg.cn/direct/d16cd7082aab437a876f71483e428cb2.png#pic_center
3.3 微调模型的测试效果

为了对比基座模型和微调模型的差异,在【Chat】界面,分别调用基座模型和微调模型的举行问答,问题来源于训练时使用的数据集。训练时的数据内容如下:
https://i-blog.csdnimg.cn/direct/1469be67c45a4a828a3088d223be2f02.png#pic_center

[*]使用基座模型举行问答:
https://i-blog.csdnimg.cn/direct/34d027efe03646febe24a2f234f8748c.png#pic_center
加载模型后,在界面的最下端输入要问的问题。基座模型答复如下
https://i-blog.csdnimg.cn/direct/d6c93ca10c774c57aaf5efa89c18202d.png#pic_center
[*]微调模型举行问答:
注意:要先辈行【卸载模型】,否则显存没有开释,剩余显存可能无法加载新的模型。
https://i-blog.csdnimg.cn/direct/f795c2d8074a4055a07c8c7ec84b9377.png#pic_center
微调模型答复如下,发现答复内容与数据会合的答案并不相符。
分析原因,应该是初始学习率偏小,然后学习的轮次也偏少,导致微调模型欠拟合。
https://i-blog.csdnimg.cn/direct/673027e1aad84cdb8826c2e3f72d2332.png#pic_center
[*]接下来就是根据履历调参,可以再尝试下,学习率修改为5e-4,epoch为6。
3.4 微调模型的合并与导出


[*]先在【Chat】将要导出的微调模型 举行加载
https://i-blog.csdnimg.cn/direct/a3fd2b38a6db4a0a9b042251fa5cd47b.png#pic_center
[*]先在【Export】设置好导出路径,开始导出
https://i-blog.csdnimg.cn/direct/ee3ff30b1ac74663a8f195ca5ce4fd6a.png#pic_center
    4 LLaMa Factory 微调模型(源码方式)

4.1 运行命令

依然选择modelscope来下载模型。工程根目录创建 run_with_command.sh。内里的内容编辑如下:
export USE_MODELSCOPE_HUB=1
# 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml运行后,若模型能正常下载则继续训。但模型下载可能存在异常。
4.2 模型的下载问题

我这里报错,基座模型路径不存在。
https://i-blog.csdnimg.cn/direct/73a35df60186431f8133789f0986ca84.png#pic_center
于是,使用直接去 modelscope上获取对应模型下载命令。方法如下:


[*] 登录网址:https://www.modelscope.cn/my/overview
[*] 搜刮所需模型:
https://i-blog.csdnimg.cn/direct/c281d6f6367148ae96ef2fcbc6fd3a13.png#pic_center
https://i-blog.csdnimg.cn/direct/566d9cb1cce740989193c4ac68d1b6d0.png#pic_center
https://i-blog.csdnimg.cn/direct/c6aaacfeaf5546f5bec564cbaa5c1a6e.png#pic_center
[*] 选择使用 modelscope download --model ***命令举行下载。想要将模型下载到指定路径,则跟一个参数即可,终极命令如下
modelscope download --model LLM-Research/Meta-Llama-3-8B-Instruct \
                                  --local_dir /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
然后等下载竣事即可
https://i-blog.csdnimg.cn/direct/495cb92bfc2c409d8a37015c005191be.png#pic_center

[*] 【设置文件的修改】
对应的要举行设置文件的修改。训练时调用的是 examples/train_lora/llama3_lora_sft.yaml,文件内必要修改个设置 model_name_or_path为上一步下载的模型路径;别的这里修改了训练的数据集为中文的数据集。
### model
# 指定了要使用的预训练模型名字或路径。这里使用的是 meta-llama/Meta-Llama-3-8B-Instruct,这是一个经过指令调优的 8B 参数的 LLaMA 模型。
# model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct

### method
stage: sft             # 指定了微调的阶段,这里是 sft(Supervised Fine-Tuning),表示监督微调。
do_train: true         # 指定了是否进行训练。
finetuning_type: lora# 指定了微调的类型,这里是 lora。
lora_target: all       # 指定了要进行 lora 微调的目标,这里是 all,表示对所有层进行微调。

### dataset
# dataset: identity,alpaca_en_demo# 指定了要使用的数据集,这里是 identity 和 alpaca_en_demo。
dataset: alpaca_zh_demo         # 使用中文的一个数据集,。
template: llama3                  # 指定了要使用的模板,这里是 llama3。
cutoff_len: 2048                  # 指定了截断长度,这里是 2048。
max_samples: 1000               # 指定了最大样本数,这里是 1000。
overwrite_cache: true             # 指定了是否覆盖缓存。
preprocessing_num_workers: 16   # 指定了预处理时的工作线程数,这里是 16。

### output
output_dir: saves/llama3-8b/lora/sft   # 指定了输出目录,这里是 saves/llama3-8b/lora/sft。
logging_steps: 10                      # 指定了日志输出的步数,这里是 10。
save_steps: 500                        # 指定了保存模型的步数,这里是 500。
plot_loss: true                        # 指定了是否绘制损失曲线。
overwrite_output_dir: true             # 指定了是否覆盖输出目录。

### train
per_device_train_batch_size: 1       # 指定了训练时每个设备的批量大小,这里是 1。
gradient_accumulation_steps: 8       # 指定了梯度累积的步数,这里是 8。
learning_rate: 1.0e-4                # 指定了学习率,这里是 1.0e-4。
num_train_epochs: 3.0                # 指定了训练的总轮数,这里是 3.0。
lr_scheduler_type: cosine            # 指定了学习率调度器的类型,这里是 cosine。
warmup_ratio: 0.1                  # 指定了预热比例,这里是 0.1。
bf16: true                           # 指定了是否使用 bf16 精度。
ddp_timeout: 180000000               # 指定了 ddp 超时时间,这里是 180000000。

### eval
val_size: 0.1                        # 指定了验证集的大小,这里是 0.1。
per_device_eval_batch_size: 1          # 指定了验证时每个设备的批量大小,这里是 1。
eval_strategy: steps                   # 指定了评估策略,这里是 steps。
eval_steps: 500                        # 指定了评估的步数,这里是 500。


完成以上操作,运行run_with_command.sh后,可正常开启训练。训练竣事后,如下图:
https://i-blog.csdnimg.cn/direct/9d76419eb2964e7b823b4442e91d38c5.png#pic_center
4.3 微调模型的对话测试


[*]run_with_command.sh文件修改内容如下:export USE_MODELSCOPE_HUB=1
# 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
# llamafactory-cli train examples/train_lora/llama3_lora_sft.yamlllamafactory-cli chat examples/inference/llama3_lora_sft.yaml
[*]打开examples/inference/llama3_lora_sft.yaml文件,同样的必要修改基座模型路径。
若使用基座模型开启对话,修改后如下:# model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
template: llama3
若使用微调模型开启对话,修改后如下:# model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora

[*]终端键入sh run_with_command.sh。就可以开启和大模型的对话了https://i-blog.csdnimg.cn/direct/8ac59eb643e0428e9fce039d6d1c1c9c.png#pic_center
4.4 LLaMa Factory 微调模型的合并

上面的两种方式,调用微调模型时,都必要同时加载基座模型。在现实使用时,希望仅使用一个大模型即可,所以这里有个合并的操作。

[*] run_with_command.sh文件修改内容如下:
export USE_MODELSCOPE_HUB=1
# 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
# llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml# llamafactory-cli chat examples/inference/llama3_lora_sft.yamlllamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml
[*] 打开examples/merge_lora/llama3_lora_sft.yaml文件,同样的必要修改基座模型路径。
注意事项:不要在合并 LoRA 适配器时使用量化模型或设置量化位数。这可能会导致合并失败或模型性能降落。
### model# model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
adapter_name_or_path: saves/llama3-8b/lora/sft
template: llama3
finetuning_type: lora
### exportexport_dir: models/llama3_lora_sftexport_size: 2export_device: cpu   ## 导出时使用的设备export_legacy_format: false
[*] 终端键入sh run_with_command.sh。乐成运行后,在保存路径下生成合并模型。https://i-blog.csdnimg.cn/direct/31351fe7735b4219b7779da676f551e1.png#pic_center
    5 将微调模型仿 OpenAI 兼容接口

5.1 服务的启动


[*] 打开examples/inference/llama3_vllm.yaml,文件内修改个model_name_or_path为微调模型的导出路径。model_name_or_path: models/llama3_lora_sft
template: llama3
infer_backend: vllm
vllm_enforce_eager: true

[*] 终端键入命令如下API_PORT=8000 llamafactory-cli api examples/inference/llama3_vllm.yaml
正常的话,服务应可以正确开启。终端界面如下图:
https://i-blog.csdnimg.cn/direct/ed14dbd8a8484c08983a7ede7f7f82e5.png#pic_center
[*]可能存在报错ValueError: Bfloat16 is only supported on GPUs with compute capability of at least 8.0. Your Tesla V100-SXM2-32GB GPU has compute capability 7.0. You can use float16 instead by explicitly setting the`dtype` flag in CLI, for example: --dtype=half.
https://i-blog.csdnimg.cn/direct/aedadd3954f04fadb8e2c380e77122a4.png#pic_center
具体原因:GPU 不支持 bfloat16 数据类型。具体的,Tesla V100-SXM2-32GB GPU 的盘算能力为 7.0,而 bfloat16 必要至少 8.0 的盘算能力。
办理方案:float16 数据类型取代 bfloat16。
具体操作:尝试在yaml文件设置,以及终端命令加上对应的参数,均无法正确运行。那就最简朴粗暴的方式,在源码中强行设置dtype。
在文件 src/llamafactory/chat/vllm_engine.py中搜刮和添加内容如下## 添加
engine_args['dtype'] = "float16"
## 搜索
self.model = AsyncLLMEngine.from_engine_args(AsyncEngineArgs(**engine_args))
修改后即可正常运行。
5.2 命令行测试

【服务器上发送哀求】


[*]服务器上另起一个终端,键入如下命令curl -X POST http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer x" \
-d '{
"model": "llama3_lora_sft",
"messages": [
    {
      "role": "user",
      "content": "1+1 等于几?"
    }
],
"max_tokens": 4096
}'
若正常运行,打印如下:
https://i-blog.csdnimg.cn/direct/18df56c09c5749248e5eee9f9c653e91.png#pic_center
5.3 可视化测试



[*] 1 NextChat的下载安装
使用release版本的windows 版本。下载后傻瓜式安装。https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/releases
https://i-blog.csdnimg.cn/direct/fe225e9d28f349b19b0546c1543d21a9.png#pic_center
https://i-blog.csdnimg.cn/direct/fba456ebefd14156b0fd0368984580cb.png#pic_center
[*] 2 NextChat的设置
一般的来说,下图中的【接口地点】填写服务器的ip和端口即可。
https://i-blog.csdnimg.cn/direct/b3939e24335e44fb868c8b8582426c5b.png#pic_center
但存在网络限制或防火墙等原因,无法向服务器中的服务正常发出哀求。要办理从本地机器访问长途服务器上的服务的问题,可以使用 SSH 隧道(也称为端口转发),从而绕过防火墙和网络限制。SSH 隧道可以将本地机器上的一个端口转发到长途服务器上的一个端口,从而实现从本地机器访问长途服务。
具体操作如下:

[*] 在本地终端运行命令ssh -L 8000:127.0.0.1:8000 LL@10.91.208.210
【-L 8000:127.0.0.1:8000】 这部门指定了端口转发的设置。
【8000】本地机器上的端口。
【127.0.0.1:8000】 长途服务器上的目标地点和端口。
【LL@10.91.208.210】 长途服务器的登录信息。
[*] 输入密码
实行上述命令后,系统会提示你输入长途服务器的密码。输入密码后,SSH 隧道就会建立。然后再在NextChat当中设置和对话。

[*] 3 微调的模型开启对话
https://i-blog.csdnimg.cn/direct/642de522ba454b078fb50f9b4bfd498d.png#pic_center
    6 使用自己的数据集举行微调

这里模型仍然选择【meta-llama/Meta-Llama-3-8B-Instruct】。
6.1 模型微调


[*]制作自己的数据集:这里仅记录整个流程,所以数据使用大模型生成,如下图。它只生成了10条,多问它几次,我这里总共收集了30条。然后在json内里增补了关于“你是谁的”问题。
https://i-blog.csdnimg.cn/direct/83e38bfb7dc24487bb9f3ee7af2e8a76.png#pic_center
[*]创建文件【./data/dami.json】,内里的内容更新为上面的json信息。
[*]修改【./data/dataset_info.json】里的内容。将自己的数据集信息添加进去。
https://i-blog.csdnimg.cn/direct/5c4be4d8c19a45f89f101d709427d596.png#pic_center
[*]修改【./examples/train_lora/llama3_lora_sft.yaml】里的设置:数据集、保存路径、以及训练时间的参数(我这里修改了放学习率)
https://i-blog.csdnimg.cn/direct/8427e98e262c4ea498e9520608fe724b.png#pic_center
6.2 微调模型推理


[*]修改【./examples/inference/llama3_lora_sft.yaml】中的路径,
https://i-blog.csdnimg.cn/direct/a86094ae0c7646099a314151b2085ccd.png#pic_center
[*]调用推理命令举行推理,这里展示下问答效果
https://i-blog.csdnimg.cn/direct/9661d747be2343298625aa67e771b104.png#pic_center
[*]后续的工作跟前面是划一的,具体的操作这里就不再记录。
合并基座模型和微调后,开启服务,使用NextChat毗连,然后举行问答,效果如下:
https://i-blog.csdnimg.cn/direct/802dd789ed1a437badf8092e11a68d0e.png#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【大模型】LLaMA-Factory的环境设置、微调模型与测试