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

鼠扑  论坛元老 | 2025-3-14 23:18:09 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1035|帖子 1035|积分 3105

媒介

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

  

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

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

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

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

  

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

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

  
  【大模型问答示例】
  

  • 文心一言

  • 通义千问

  • Kimi

    OK,前面讲了一堆,接下来进入正题:大模型的微调工程-——LLaMA-Factory。
  1 工程介绍

  

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

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


  

    2 环境设置

  2.1 硬件与环境

  

  • 显卡型号:建议不低于3090,显存尽量24G+。这样可以训练比力主流的入门级别大模型 7B左右的版本。

  • CUDA版本,保举使用12.2。查看自己的设备中的cuda版本的命令 nvidia-smi

  2.2 运行环境设置

  

  • 终端键入如下命令
    1. ## 创建虚拟环境
    2. conda create -n llama_factory python=3.11 -c conda-forge
    3. ## 激活虚拟环境
    4. conda activate llama_factory
    5. ## 环境安装
    6. pip install -e ".[torch,metrics]"
    7. ## 这里我从modelscope下载模型,所以要进行库的安装
    8. pip install modelscope -U
    复制代码
  • 环境安装竣事后,查看版本信息
    1. llamafactory-cli version
    复制代码
  

  

  • 查看gpu是否能被调用起来
    1. python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
    复制代码
  

上面的内容都正确运行竣事后,说明环境设置已经完成。
    3 LLaMa Factory 微调模型(使用web方式)

  3.1 界面开启

  

  • 设置使用modelscope下载模型,终端键入内容如下。也可在工程中 .env.local 文件中设置。
    1. export USE_MODELSCOPE_HUB=1
    复制代码
  • 下载的大模型,一般都是几个G左右,所以下载的路径尽量不要放在系统盘,优先选择挂载的数据盘。所以就必要设置下对应的路径,终端键入内容如下,后面的路径根据自己现实情况更换。
    1. export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
    2. export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
    复制代码
  • 开启web界面
    1. llamafactory-cli webui
    复制代码
  方便起见,上面的命令可以写在一个bash文件中。具体的,在根目录创建个 run_with_webui.sh,内里的内容为如下。固然也可以将其设置的系统环境变量当中,这里使用临时方式。
  1. export USE_MODELSCOPE_HUB=1
  2. # 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
  3. export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
  4. llamafactory-cli webui
复制代码
运行竣事后,在浏览器的http://localhost:7860/中可以打开大模型训练界面。WebUI 主要分为四个界面:训练、评估与预测、对话、导出。
  
  3.2 模型微调训练

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

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

  尝试如下图,设置好后开启训练。
若必要量化,在【量化品级】中,选择对应的数值即可,量化会带来精度损失,但显存占用会低落。

第一次调用会耗费些时间,下载模型和数据(可在终端的打印的信息查看进度)。
运行时可能会报错:

  

  • 若存在库缺失,pip安装即可;
  • 可能报错,说modelscope和datasets的库不兼容,安装兼容版本即可。个人使用可运行版本如下

    训练竣事后界面显示如下:

  
  3.3 微调模型的测试效果

  为了对比基座模型和微调模型的差异,在【Chat】界面,分别调用基座模型和微调模型的举行问答,问题来源于训练时使用的数据集。训练时的数据内容如下:

  

  • 使用基座模型举行问答:

    加载模型后,在界面的最下端输入要问的问题。基座模型答复如下

  • 微调模型举行问答:
    注意:要先辈行【卸载模型】,否则显存没有开释,剩余显存可能无法加载新的模型。

    微调模型答复如下,发现答复内容与数据会合的答案并不相符。
    分析原因,应该是初始学习率偏小,然后学习的轮次也偏少,导致微调模型欠拟合。

  • 接下来就是根据履历调参,可以再尝试下,学习率修改为5e-4,epoch为6。
  
  3.4 微调模型的合并与导出

  

  • 先在【Chat】将要导出的微调模型 举行加载

  • 先在【Export】设置好导出路径,开始导出

    4 LLaMa Factory 微调模型(源码方式)

  
  4.1 运行命令

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

  我这里报错,基座模型路径不存在。

于是,使用直接去 modelscope上获取对应模型下载命令。方法如下:

  

  • 登录网址:https://www.modelscope.cn/my/overview
  • 搜刮所需模型:



  • 选择使用 modelscope download --model ***命令举行下载。想要将模型下载到指定路径,则跟一个参数即可,终极命令如下
    1. modelscope download --model LLM-Research/Meta-Llama-3-8B-Instruct \
    2.                                     --local_dir /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
    复制代码
    然后等下载竣事即可


  • 【设置文件的修改】
    对应的要举行设置文件的修改。训练时调用的是 examples/train_lora/llama3_lora_sft.yaml,文件内必要修改个设置 model_name_or_path为上一步下载的模型路径;别的这里修改了训练的数据集为中文的数据集。

    1. ### model
    2. # 指定了要使用的预训练模型名字或路径。这里使用的是 meta-llama/Meta-Llama-3-8B-Instruct,这是一个经过指令调优的 8B 参数的 LLaMA 模型。
    3. # model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
    4. model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
    5. ### method
    6. stage: sft             # 指定了微调的阶段,这里是 sft(Supervised Fine-Tuning),表示监督微调。
    7. do_train: true         # 指定了是否进行训练。
    8. finetuning_type: lora  # 指定了微调的类型,这里是 lora。
    9. lora_target: all       # 指定了要进行 lora 微调的目标,这里是 all,表示对所有层进行微调。
    10. ### dataset
    11. # dataset: identity,alpaca_en_demo  # 指定了要使用的数据集,这里是 identity 和 alpaca_en_demo。
    12. dataset: alpaca_zh_demo           # 使用中文的一个数据集,。
    13. template: llama3                  # 指定了要使用的模板,这里是 llama3。
    14. cutoff_len: 2048                  # 指定了截断长度,这里是 2048。
    15. max_samples: 1000                 # 指定了最大样本数,这里是 1000。
    16. overwrite_cache: true             # 指定了是否覆盖缓存。
    17. preprocessing_num_workers: 16     # 指定了预处理时的工作线程数,这里是 16。
    18. ### output
    19. output_dir: saves/llama3-8b/lora/sft   # 指定了输出目录,这里是 saves/llama3-8b/lora/sft。
    20. logging_steps: 10                      # 指定了日志输出的步数,这里是 10。
    21. save_steps: 500                        # 指定了保存模型的步数,这里是 500。
    22. plot_loss: true                        # 指定了是否绘制损失曲线。
    23. overwrite_output_dir: true             # 指定了是否覆盖输出目录。
    24. ### train
    25. per_device_train_batch_size: 1       # 指定了训练时每个设备的批量大小,这里是 1。
    26. gradient_accumulation_steps: 8       # 指定了梯度累积的步数,这里是 8。
    27. learning_rate: 1.0e-4                # 指定了学习率,这里是 1.0e-4。
    28. num_train_epochs: 3.0                # 指定了训练的总轮数,这里是 3.0。
    29. lr_scheduler_type: cosine            # 指定了学习率调度器的类型,这里是 cosine。
    30. warmup_ratio: 0.1                    # 指定了预热比例,这里是 0.1。
    31. bf16: true                           # 指定了是否使用 bf16 精度。
    32. ddp_timeout: 180000000               # 指定了 ddp 超时时间,这里是 180000000。
    33. ### eval
    34. val_size: 0.1                          # 指定了验证集的大小,这里是 0.1。
    35. per_device_eval_batch_size: 1          # 指定了验证时每个设备的批量大小,这里是 1。
    36. eval_strategy: steps                   # 指定了评估策略,这里是 steps。
    37. eval_steps: 500                        # 指定了评估的步数,这里是 500。
    复制代码
  完成以上操作,运行run_with_command.sh后,可正常开启训练。训练竣事后,如下图:

  
  4.3 微调模型的对话测试

  

  • run_with_command.sh文件修改内容如下:
    1. export USE_MODELSCOPE_HUB=1
    2. # 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
    3. export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
    4. # llamafactory-cli train examples/train_lora/llama3_lora_sft.yamlllamafactory-cli chat examples/inference/llama3_lora_sft.yaml
    复制代码
  • 打开examples/inference/llama3_lora_sft.yaml文件,同样的必要修改基座模型路径。
    若使用基座模型开启对话,修改后如下:
    1. # model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
    2. model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
    3. template: llama3
    复制代码
    若使用微调模型开启对话,修改后如下:
    1. # model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
    2. model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
    3. adapter_name_or_path: saves/llama3-8b/lora/sft
    4. template: llama3
    5. finetuning_type: lora
    复制代码
  • 终端键入sh run_with_command.sh。就可以开启和大模型的对话了

  
  4.4 LLaMa Factory 微调模型的合并

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

  • run_with_command.sh文件修改内容如下:
    1. export USE_MODELSCOPE_HUB=1
    2. # 使用 modelscope 下载模型 export MODELSCOPE_CACHE="/opt/ai-platform/lldataset/240/modelscope/"
    3. export MODELSCOPE_MODULES_CACHE="/opt/ai-platform/lldataset/240/modelscope/modelscope_modules"
    4. # 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 适配器时使用量化模型或设置量化位数。这可能会导致合并失败或模型性能降落。

    1. ### model# model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
    2. model_name_or_path: /opt/ai-platform/lldataset/240/modelscope/hub/meta-llama/Meta-Llama-3-8B-Instruct
    3. adapter_name_or_path: saves/llama3-8b/lora/sft
    4. template: llama3
    5. finetuning_type: lora
    6. ### exportexport_dir: models/llama3_lora_sftexport_size: 2export_device: cpu   ## 导出时使用的设备export_legacy_format: false
    复制代码
  • 终端键入sh run_with_command.sh。乐成运行后,在保存路径下生成合并模型。

    5 将微调模型仿 OpenAI 兼容接口

  
  5.1 服务的启动

  

  • 打开examples/inference/llama3_vllm.yaml,文件内修改个model_name_or_path为微调模型的导出路径。
    1. model_name_or_path: models/llama3_lora_sft
    2. template: llama3
    3. infer_backend: vllm
    4. vllm_enforce_eager: true
    复制代码
  • 终端键入命令如下
    1. API_PORT=8000 llamafactory-cli api examples/inference/llama3_vllm.yaml
    复制代码
    正常的话,服务应可以正确开启。终端界面如下图:

  • 可能存在报错
    1. 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.
    复制代码

    具体原因:GPU 不支持 bfloat16 数据类型。具体的,Tesla V100-SXM2-32GB GPU 的盘算能力为 7.0,而 bfloat16 必要至少 8.0 的盘算能力。
    办理方案:float16 数据类型取代 bfloat16。
    具体操作:尝试在yaml文件设置,以及终端命令加上对应的参数,均无法正确运行。那就最简朴粗暴的方式,在源码中强行设置dtype。
    在文件 src/llamafactory/chat/vllm_engine.py中搜刮和添加内容如下
    1. ## 添加
    2. engine_args['dtype'] = "float16"
    3. ## 搜索
    4. self.model = AsyncLLMEngine.from_engine_args(AsyncEngineArgs(**engine_args))
    复制代码
    修改后即可正常运行。
  
  5.2 命令行测试

  【服务器上发送哀求】
  

  • 服务器上另起一个终端,键入如下命令
    1. curl -X POST http://127.0.0.1:8000/v1/chat/completions \
    2. -H "Content-Type: application/json" \
    3. -H "Authorization: Bearer x" \
    4. -d '{
    5.   "model": "llama3_lora_sft",
    6.   "messages": [
    7.     {
    8.       "role": "user",
    9.       "content": "1+1 等于几?"
    10.     }
    11.   ],
    12.   "max_tokens": 4096
    13. }'
    复制代码
    若正常运行,打印如下:

  
  5.3 可视化测试

  

  • 1 NextChat的下载安装
    使用release版本的windows 版本。下载后傻瓜式安装。https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/releases


  • 2 NextChat的设置
    一般的来说,下图中的【接口地点】填写服务器的ip和端口即可。

    但存在网络限制或防火墙等原因,无法向服务器中的服务正常发出哀求。要办理从本地机器访问长途服务器上的服务的问题,可以使用 SSH 隧道(也称为端口转发),从而绕过防火墙和网络限制。SSH 隧道可以将本地机器上的一个端口转发到长途服务器上的一个端口,从而实现从本地机器访问长途服务。
    具体操作如下:


    • 在本地终端运行命令
      1. 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 微调的模型开启对话

    6 使用自己的数据集举行微调

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

  

  • 制作自己的数据集:这里仅记录整个流程,所以数据使用大模型生成,如下图。它只生成了10条,多问它几次,我这里总共收集了30条。然后在json内里增补了关于“你是谁的”问题。

  • 创建文件【./data/dami.json】,内里的内容更新为上面的json信息。
  • 修改【./data/dataset_info.json】里的内容。将自己的数据集信息添加进去。

  • 修改【./examples/train_lora/llama3_lora_sft.yaml】里的设置:数据集、保存路径、以及训练时间的参数(我这里修改了放学习率)
  

  
  6.2 微调模型推理

  

  • 修改【./examples/inference/llama3_lora_sft.yaml】中的路径,

  • 调用推理命令举行推理,这里展示下问答效果

  • 后续的工作跟前面是划一的,具体的操作这里就不再记录。
    合并基座模型和微调后,开启服务,使用NextChat毗连,然后举行问答,效果如下:

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表