AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

简介: AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

一、引言

贫富差距的产生是信息差,技术贫富差距的产生亦如此。如果可以自我发现或者在别人的指导下发现优秀的开源项目,学习或工作效率真的可以事半功倍。

今天力荐的项目是LLaMA-Factory,我在去年8月份就开始使用这个项目进行模型部署和微调训练(fine tune),当时各家大模型仅限于推理测试,OpenAI还没有对外提供微调服务,加上这个项目部署丝滑(更新及时,不会出现环境依赖问题,代码逻辑上几乎无错误),觉得好牛啊。现在来看项目已经达到22K星,果然酒深不怕巷子香。

本文的核心价值在于适配国内网络环境:官方文档是以国际hugging face库为示例,本篇文章以国内modelscope库为示例。让国内网络环境用户进行大模型微调训练更加丝滑。

二、LLaMA-Factory项目介绍

2.1 项目特色

  • 多种模型:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
  • 集成方法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练和 ORPO 训练。
  • 多种精度:32 比特全参数微调、16 比特冻结微调、16 比特 LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8 的 2/4/8 比特 QLoRA 微调。
  • 先进算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 Agent 微调。
  • 实用技巧:FlashAttention-2、Unsloth、RoPE scaling、NEFTune 和 rsLoRA。
  • 实验监控:LlamaBoard、TensorBoard、Wandb、MLflow 等等。
  • 极速推理:基于 vLLM 的 OpenAI 风格 API、浏览器界面和命令行接口。

2.2性能指标

与 ChatGLM 官方的 P-Tuning 微调相比,LLaMA Factory 的 LoRA 微调提供了 3.7 倍的加速比,同时在广告文案生成任务上取得了更高的 Rouge 分数。结合 4 比特量化技术,LLaMA Factory 的 QLoRA 微调进一步降低了 GPU 显存消耗。

  • Training Speed: 训练阶段每秒处理的样本数量。(批处理大小=4,截断长度=1024)
  • Rouge Score: 广告文案生成任务验证集上的 Rouge-2 分数。(批处理大小=4,截断长度=1024)
  • GPU Memory: 4 比特量化训练的 GPU 显存峰值。(批处理大小=1,截断长度=1024)
  • 我们在 ChatGLM 的 P-Tuning 中采用 pre_seq_len=128,在 LLaMA Factory 的 LoRA 微调中采用 lora_rank=32。

2.3支持模型

  • 默认模块应作为 --lora_target 参数的默认值,可使用 --lora_target all 参数指定全部模块以取得更好的效果。
  • 对于所有“基座”(Base)模型,--template 参数可以是 default, alpaca, vicuna 等任意值。但“对话”(Instruct/Chat)模型请务必使用对应的模板。
  • 请务必在训练和推理时使用完全一致的模板。

2.4训练方法

这里特别说一下,本框架不仅支持预训练(Pre-Training)、指令监督微调训练(Supervised Fine-Tuning),还是支持奖励模型训练(Reward Modeling)、PPO、DPO、ORPO等强化学习训练

各训练阶段的含义参考此图:

2.5硬件依赖  

不同尺寸的模型,不同训练方式,所需GPU显存见下表,在工作中经常被问到需要多少资源,建议收藏

三、LLaMA-Factory项目安装、部署

这里建议使用docker compose部署,conda及docker部署方式见项目文档。

3.1 拉取项目代码

git clone https://github.com/hiyouga/LLaMA-Factory.git

3.2 项目目录结构

[root@localhost LLaMA-Factory]# tree -d
.
├── assets
├── data   //训练数据放在这,里面有配置文件可以新增自己的数据
│   ├── belle_multiturn
│   ├── example_dataset
│   ├── hh_rlhf_en
│   ├── mllm_demo_data
│   └── ultra_chat
├── evaluation  //评测脚本在这里
│   ├── ceval
│   ├── cmmlu
│   └── mmlu
├── examples    //各种推理、训练的配置文件在这里(以前还是shell脚本,现在是配置文件了)
│   ├── accelerate
│   ├── deepspeed
│   ├── extras
│   │   ├── badam
│   │   ├── fsdp_qlora
│   │   ├── galore
│   │   ├── llama_pro
│   │   ├── loraplus
│   │   └── mod
│   ├── full_multi_gpu
│   ├── inference
│   ├── lora_multi_gpu
│   ├── lora_single_gpu
│   ├── merge_lora
│   └── qlora_single_gpu
├── hf_cache   //docker镜像中关联的huggingface目录,存储从hf库下载的模型,本文不用
├── ms_cache   //docker镜像中关联的modelscope目录,存储从ms库下载的模型,本文用这个
│   └── hub
│       ├── baichuan-inc
│       │   └── Baichuan2-7B-Chat  //现在了百川2-7B举例
│       └── temp
├── output  //训练输出的ckpt模型数据在这里
├── scripts  //训练代码依赖的脚本
├── src    //核心目录,源代码在这里
│   └── llmtuner
│       ├── api
│       ├── chat
│       ├── data
│       ├── eval
│       ├── extras
│       ├── hparams
│       ├── model
│       │   └── utils
│       ├── train
│       │   ├── dpo
│       │   ├── orpo
│       │   ├── ppo
│       │   ├── pt
│       │   ├── rm
│       │   └── sft
│       └── webui
│           └── components
└── tests   //测试代码
 
55 directories

3.3 Dockerfile适配国内网络环境

[root@localhost LLaMA-Factory]# vim Dockerfile
 
FROM nvcr.io/nvidia/pytorch:24.01-py3
 
WORKDIR /app
 
COPY requirements.txt /app/
RUN pip install -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple    
#修改点1:在官方代码中加入腾讯pip镜像,否则默认镜像拉取依赖包极慢
 
COPY . /app/
RUN pip install -e .[deepspeed,metrics,bitsandbytes,qwen,modelscope] -i https://mirrors.cloud.tencent.com/pypi/simple
#修改点2:同上,在官方代码中加入腾讯pip镜像,否则默认镜像拉取依赖包极慢
#修改点3:在可选依赖包内加入modelscope,这样就可以下载modelscope的模型了
 
VOLUME [ "/root/.cache/modelscope/", "/app/data", "/app/output" ]
#修改点4:匿名卷中,将/root/.cache/huggingface/改为/root/.cache/modelscope/
#小知识:docker run -v与Dockerfile中VOLUME的区别:
#VOLUME主要用于具有数据存储需求的Dockerfile中,以免用户docker run忘记指定-v导致容器删除后,造成的数据丢失,这个项目要存储模型、训练数据、训练输出的模型数据,所以分别建立这3个匿名卷
#如果没有-v指定,默认存储在/var/lib/docker/volumes/{容器ID}中,如果-v指定,则存储在指定目录中
 
EXPOSE 7860
#默认指定监听的端口
 
CMD [ "llamafactory-cli", "webui" ]
#镜像模型启动模型为webui,我觉得也可以改为train、chat、expose、api,还没试。

3.4 docker-compose.yml适配国内网络环境

[root@localhost LLaMA-Factory]# vim docker-compose.yml 
 
version: '3.8'
 
services:
  llama-factory:
    build:
      dockerfile: Dockerfile
      context: .
    container_name: llama_factory
    volumes:
      - ./ms_cache:/root/.cache/modelscope/
#修改点1:将./ms_cache:/root/.cache/huggingface/修改为./ms_cache:/root/.cache/modelscope/,使用Dockerfile里建立的modelscope挂载点
      - ./data:/app/data
      - ./output:/app/output
    environment:
      - CUDA_VISIBLE_DEVICES=1
#修改点2:nvidia-smi看看服务器哪张卡显存充足,指定为对应的显卡,目前webui仅支持单卡,多卡训练请使用命令行。
      - USE_MODELSCOPE_HUB=1
#修改点3:环境变量中加入USE_MODELSCOPE_HUB=1,采用从modelscope库中下载模型
    ports:
      - "7860:7860"
    ipc: host
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            count: "all"
            capabilities: [gpu]
    restart: unless-stopped

3.5 docker compose方式启动

修改完Dockerfile和docker-compose.yml之后,就可以打本地镜像启动啦,期待您一遍过~

docker compose -f ./docker-compose.yml up -d
# -f 指定docker-compose.yml
# -d 后台运行,可以使用docker logs llama_factory -f --tail 100查看启动日志

如果启动没问题,在浏览器输入宿主机ip+7860(如123.123.123.123:7860)进入webui界面,恭喜!

四、LLaMA-Factory项目微调训练

终于来到我们最喜欢的炼丹环节!开发工作中,搭环境永远是最麻烦的,雨过天晴,让我们一起训练大模型吧!

4.1 大模型微调训练-Train(训练)

根据WebUI逐个勾选参数,点击预览命令便会生成后台执行的命令,这个命令可以保存下来,以命令行方式运行也是可以的,点击开始进行训练,下面参照命令说明每个参数的意义。

CUDA_VISIBLE_DEVICES=1 llamafactory-cli train \
    --stage sft \      #指定sft微调训练,可选rm,dpo等
    --do_train True \  #训练是do_train,预测是do_predict
    --model_name_or_path baichuan-inc/Baichuan2-7B-Chat \  #模型目录,如果网络不行,可以配置本地目录,但今天的modelscope教程已经解决这个问题
    --finetuning_type lora \    #训练类型为lora,也可以进行full和freeze训练
    --quantization_bit 4 \      #量化精度,4bit,可选8bit和none不量化
    --template baichuan2 \      #模版,每个模型要选对应的模版,对应关系见上文
    --flash_attn auto \          #flash attention,闪光注意力机制,一种加速注意力计算的方法,后面会专门写一篇,baichuan2暂不支持,这里选auto,对于支持的模型可以选择fa2
    --dataset_dir data \        #数据目录
    --dataset oaast_sft_zh \    #数据集,可以通过更改dataset_info.json文件配置自己的数据集
    --cutoff_len 1024 \         #截断长度
    --learning_rate 5e-05 \     #学习率,AdamW优化器的初始学习率
    --num_train_epochs 20.0 \   #训练轮数,需要执行的训练总轮数
    --max_samples 100000 \      #最大样本数,每个数据集的最大样本数
    --per_device_train_batch_size 1 \    #批处理大小,每个GPU处理的样本数量,推荐为1
    --gradient_accumulation_steps 1 \    #梯度累积,梯度累积的步数,推荐为1
    --lr_scheduler_type cosine \         #学习率调节器,可选line,constant等多种
    --max_grad_norm 1.0 \                #最大梯度范数,用于梯度裁剪的范数
    --logging_steps 100 \                #日志间隔,每两次日志输出间的更新步数
    --save_steps 5000 \                  #保存间隔,每两次断点保存间的更新步数。
    --warmup_steps 0.1 \                 #预热步数,学习率预热采用的步数。
    --optim adamw_torch \                #优化器,使用的优化器:adamw_torch、adamw_8bit 或 adafactor
    --packing False \                    
    --report_to none \
    --output_dir saves/Baichuan2-7B-Chat/lora/train_2024-05-13-06-18-23 \    #数据目录
    --fp16 True \                        #计算类型,可以fp16、bf16等
    --lora_rank 32 \                     #LoRA秩,LoRA矩阵的秩大小,越大精度越高,推荐32
    --lora_alpha 16 \                    #LoRA 缩放系数
    --lora_dropout 0 \
    --lora_target W_pack \               #模型对应的模块,具体对应关系见上文
    --val_size 0.1 \
    --evaluation_strategy steps \
    --eval_steps 5000 \
    --per_device_eval_batch_size 1 \
    --load_best_model_at_end True \
    --plot_loss True

项目经过长时间的积淀,支持的功能非常全面,写了一些Lora的参数说明,后面还有RLHF、GeLore参数说明,BAdam参数说明,文章会逐渐补全,对于重点微调技术,后面会单独开文章讲解。

4.2 大模型微调训练-Evaluate&Predict(评估&预测)

评估&预测模块,针对微调完成的模型进行评估。

根据勾选参数预测&评估的命令如下,多数都好理解,不再赘述

CUDA_VISIBLE_DEVICES=1 llamafactory-cli train \
    --stage sft \
    --model_name_or_path baichuan-inc/Baichuan2-7B-Chat \
    --finetuning_type lora \
    --quantization_bit 4 \
    --template baichuan2 \
    --flash_attn auto \
    --dataset_dir data \
    --dataset oaast_sft_zh \
    --cutoff_len 1024 \
    --max_samples 100000 \
    --per_device_eval_batch_size 2 \
    --predict_with_generate True \
    --max_new_tokens 512 \
    --top_p 0.7 \
    --temperature 0.95 \
    --output_dir saves/Baichuan2-7B-Chat/lora/eval_2024-05-13-06-18-23 \
    --do_predict True

执行成功后,可以看到进度条。

4.3 大模型微调训练-Chat(对话)

在训练、评估之后,可以进行Chat测试,如果配置了微调后的适配器路径,就会将基座模型与微调模型合并在一起进行测试,如果不配置适配器路径,只对基座模型进行测试。

推理引擎默认为huggingface,可以选择vllm进行加速。

4.4 大模型微调训练-Export(导出)

模型导出,可将基座模型与微调后的模型合并到出,一键完成。

五、总结

本文先对LLaMA-Factory项目进行介绍,之后逐行详细介绍了该项目在国内网络环境下如何安装、部署,最后以Baichuan2-7B为例,通过讲解训练参数的方式详细介绍了基于LLaMA-Factory WebUI的大模型微调训练。篇幅有限,专栏内会持续更新,详细介绍大模型微调训练方法。如果觉得对你有帮助,期待您的关注,点赞、收藏或评论,您的支持是我持续码字的动力。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
15天前
|
监控 安全
从 Racket 语言出发,创新员工网络监控软件的框架
在数字化企业环境中,员工网络监控软件对于保障信息安全和提升效率至关重要。Racket 语言凭借其独特特性和强大功能,为开发创新的监控软件提供了新可能。通过捕获和分析网络数据包、记录员工网络活动日志,甚至构建复杂的监控框架,Racket 能够满足企业的定制化需求,为企业信息安全和管理提供强有力支持。未来,基于 Racket 的创新解决方案将不断涌现。
34 6
|
17天前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
15天前
|
机器学习/深度学习 数据采集 人工智能
AI与机器学习:从理论到实践
【10月更文挑战第2天】本文将深入探讨AI和机器学习的基本概念,以及它们如何从理论转化为实际的应用。我们将通过Python代码示例,展示如何使用机器学习库scikit-learn进行数据预处理、模型训练和预测。无论你是AI领域的初学者,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。
|
16天前
|
Python 机器学习/深度学习 人工智能
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
【10月更文挑战第1天】本文通过构建一个简单的强化学习环境,演示了如何创建和训练智能体以完成特定任务。我们使用Python、OpenAI Gym和PyTorch搭建了一个基础的智能体,使其学会在CartPole-v1环境中保持杆子不倒。文中详细介绍了环境设置、神经网络构建及训练过程。此实战案例有助于理解智能体的工作原理及基本训练方法,为更复杂应用奠定基础。首先需安装必要库: ```bash pip install gym torch ``` 接着定义环境并与之交互,实现智能体的训练。通过多个回合的试错学习,智能体逐步优化其策略。这一过程虽从基础做起,但为后续研究提供了良好起点。
56 4
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
|
18小时前
|
机器学习/深度学习 人工智能 算法
介绍一下AI在药物研发中的应用。
【10月更文挑战第16天】介绍一下AI在药物研发中的应用。
7 0
|
5天前
|
机器学习/深度学习 存储 人工智能
揭秘机器学习背后的神秘力量:如何高效收集数据,让AI更懂你?
【10月更文挑战第12天】在数据驱动的时代,机器学习广泛应用,从智能推荐到自动驾驶。本文以电商平台个性化推荐系统为例,探讨数据收集方法,包括明确数据需求、选择数据来源、编写代码自动化收集、数据清洗与预处理及特征工程,最终完成数据的训练集和测试集划分,为模型训练奠定基础。
14 3
|
12天前
|
机器学习/深度学习 人工智能 算法
打造你的超级Agent智能体——在虚拟迷宫中智斗未知,解锁AI进化之谜的惊心动魄之旅!
【10月更文挑战第5天】本文介绍了一个基于强化学习的Agent智能体项目实战,通过控制Agent在迷宫环境中找到出口来完成特定任务。文章详细描述了环境定义、Agent行为及Q-learning算法的实现。使用Python和OpenAI Gym框架搭建迷宫环境,并通过训练得到的Q-table测试Agent表现。此项目展示了构建智能体的基本要素,适合初学者理解Agent概念及其实现方法。
46 9
|
9天前
|
人工智能 算法 决策智能
面向软件工程的AI智能体最新进展,复旦、南洋理工、UIUC联合发布全面综述
【10月更文挑战第9天】近年来,基于大型语言模型(LLM)的智能体在软件工程领域展现出显著成效。复旦大学、南洋理工大学和伊利诺伊大学厄巴纳-香槟分校的研究人员联合发布综述,分析了106篇论文,探讨了这些智能体在需求工程、代码生成、静态代码检查、测试、调试及端到端软件开发中的应用。尽管表现出色,但这些智能体仍面临复杂性、性能瓶颈和人机协作等挑战。
21 1
|
8天前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
20 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
12天前
|
人工智能 JSON 自然语言处理
开源模型+Orchestrating Agents多智能体框架,易用、强大且可控
本文采用开源Qwen2.5-14B-instruct-GGUF来体验多智能体编排和交接,希望在体验多智能体编排和交接框架的同时,一起评估中小参数规模的模型(14B)能否较好的完成多智能体任务。