百余款大语言模型和视觉语言模型统一高效微调高效开源平台LLaMA – Factory

百余款大语言模型和视觉语言模型统一高效微调高效开源平台LLaMA - Factory

LLaMA-Factory

LLaMA – Factory项目详解

项目简介

LLaMA – Factory是一个在GitHub上开源的项目,旨在实现100多个大语言模型(LLMs)和视觉语言模型(VLMs)的统一高效微调。项目的目标是让微调大语言模型变得简单,即使对于没有深厚技术背景的用户,也能通过零代码的命令行界面(CLI)和Web用户界面(UI)来完成复杂的模型微调任务。

该项目提供了多种训练方法和丰富的工具集,支持众多主流模型,涵盖了从基础的预训练到高级的强化学习优化等多种训练场景。通过LLaMA – Factory,研究人员和开发者能够快速验证新的想法,企业也可以基于此定制符合自身需求的语言模型。同时,项目也推动了大语言模型技术的广泛应用和发展,促进了相关领域的研究和创新。

项目特点

  1. 模型多样性:支持众多模型,如LLaMA、LLaVA、Mistral、Mixtral – MoE、Qwen、Qwen2 – VL、Yi、Gemma、Baichuan、ChatGLM、Phi等。无论是基础研究中常用的模型,还是具有特定应用场景的模型,用户都能在该项目中找到相应的支持。
  2. 方法集成性:集成了多种训练方法,包括(连续)预训练、(多模态)监督微调、奖励建模、近端策略优化(PPO)、直接偏好优化(DPO)、知识迁移优化(KTO)、在线近端策略优化(ORPO)等。这使得用户可以根据不同的任务需求和数据特点,选择最合适的训练方法,以达到最佳的模型性能。
  3. 资源可扩展性:提供了多种量化和微调策略,如16位全量微调、冻结微调、低秩自适应(LoRA)以及2/3/4/5/6/8位的QLoRA(通过AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ)。这些策略可以在不同的硬件资源条件下,灵活调整模型训练的内存需求和计算效率,使得在有限的硬件资源下也能进行大规模模型的训练。
  4. 算法先进性:引入了先进的算法,如GaLore、BAdam、APOLLO、Adam – mini、DoRA、LongLoRA、LLaMA Pro、Mixture – of – Depths、LoRA +、LoftQ、PiSSA和Agent tuning等。这些算法进一步提升了模型的训练效率和性能,使得模型在复杂任务上能够取得更好的表现。
  5. 实用技巧丰富:采用了如FlashAttention – 2、Unsloth、Liger Kernel、RoPE缩放、NEFTune和rsLoRA等实用技巧。这些技巧有助于加速训练过程、扩展模型的上下文长度以及提升模型的稳定性和效率。
  6. 实验监控多样:支持多种实验监控工具,如LlamaBoard、TensorBoard、Wandb、MLflow、SwanLab等。用户可以方便地跟踪训练过程中的各种指标,实时了解模型的训练状态,及时调整训练参数。
  7. 推理速度快:提供了OpenAI风格的API、Gradio UI和基于vLLM的CLI,能够实现快速并发推理。这使得在实际应用中,模型能够快速响应用户的请求,提高了应用的用户体验。

技术原理

  1. 模型支持原理:项目通过对不同模型的架构和特点进行深入分析,构建了统一的接口和适配层,使得各种模型都能在相同的框架下进行训练和微调。例如,对于不同模型的输入输出格式、参数初始化方式等进行标准化处理,从而实现对100多种模型的统一支持。
  2. 训练方法技术细节
    • 全量微调(Full – tuning):对模型的所有参数进行训练,能够充分利用数据的信息,但计算成本高,需要大量的内存和计算资源。在LLaMA – Factory中,通过优化的梯度计算和内存管理策略,提高了全量微调的效率。
    • 冻结微调(Freeze – tuning):只对模型的部分层或参数进行训练,其余层的参数保持不变。这种方法可以减少计算量和内存需求,适用于在已有预训练模型基础上进行特定任务的微调。项目通过灵活的参数设置,方便用户指定需要冻结和微调的层。
    • 低秩自适应(LoRA):通过在模型中引入可训练的低秩矩阵,来近似全量微调的效果。LoRA在保持模型性能的同时,显著减少了可训练参数的数量,从而降低了计算成本和内存需求。在LLaMA – Factory中,对LoRA的实现进行了优化,提高了训练速度和稳定性。
    • QLoRA:结合了量化技术和LoRA,通过对模型参数进行低比特量化,进一步减少内存需求。同时,通过优化的量化策略,保持了模型的精度。项目支持2/3/4/5/6/8位的QLoRA,用户可以根据硬件资源和精度要求选择合适的量化位数。
  3. 先进算法创新点
    • GaLore、BAdam、APOLLO、Adam – mini等优化器:这些优化器针对大语言模型的特点进行了改进,例如在自适应学习率调整、梯度计算优化等方面做出创新,使得模型在训练过程中能够更快收敛,同时减少梯度消失或爆炸的问题。
    • DoRA:提出了权重分解的LoRA方法,通过对权重矩阵进行分解,进一步减少了可训练参数的数量,同时提高了模型的训练效率和泛化能力。
    • LongLoRA:通过引入S² – Attn(Shift Short Attention)机制,扩展了模型的上下文长度,使得模型能够处理更长的文本序列,在长文本任务上表现更优。
    • LLaMA Pro:采用了块扩展(block expansion)技术,增加了模型的表达能力,同时通过优化的架构设计,提高了模型的计算效率。
  4. 实用技巧原理
    • FlashAttention – 2:是一种高效的注意力计算方法,通过对注意力计算过程进行优化,减少了内存访问和计算量,从而加速了模型的训练过程。特别是在处理长序列时,FlashAttention – 2的优势更加明显。
    • Unsloth:通过对模型的注意力机制进行改进,实现了长序列训练的加速。它能够在有限的内存下处理更长的文本序列,同时提高了训练速度,例如在Llama – 2 – 7B – 56k模型上,相比FlashAttention – 2有117%的速度提升和50%的内存优化。
    • RoPE缩放:通过对位置嵌入(Position Embedding)进行缩放,扩展了模型的上下文长度。在训练和推理过程中,通过不同的缩放策略(如linear和dynamic),使得模型能够更好地处理超长文本。

类似项目

  1. FastChat
    • 项目简介:是一个基于Transformer的聊天机器人训练框架,专注于聊天机器人的训练和优化。它提供了一系列工具和方法,用于快速搭建和训练高质量的聊天机器人模型。与LLaMA – Factory类似,FastChat也支持多种模型,并提供了简单易用的接口。然而,LLaMA – Factory的优势在于其更广泛的模型支持和更多样化的训练方法,而FastChat可能在聊天机器人特定场景的优化上更为深入。项目链接
  2. PEFT(Parameter – Efficient Fine – Tuning)
    • 项目简介:主要聚焦于参数高效微调技术,提供了一系列方法来减少微调模型时的可训练参数数量,从而降低计算成本和内存需求。LLaMA – Factory在一定程度上借鉴了PEFT的思想,并在此基础上进行了扩展和优化,不仅支持PEFT中的方法,还引入了更多先进的算法和技巧。PEFT更侧重于技术的研究和实现,而LLaMA – Factory则更注重将这些技术整合到一个完整的、易用的框架中,方便用户进行实际的模型微调。项目链接
  3. TRL(Transformer Reinforcement Learning)
    • 项目简介:专注于将强化学习与Transformer模型相结合,用于优化语言模型的行为。它提供了一些工具和算法,帮助用户在强化学习的框架下对语言模型进行训练和优化。LLaMA – Factory同样支持强化学习相关的训练方法,如PPO等,但LLaMA – Factory的功能更加全面,涵盖了从预训练到微调的多种任务,并且支持更多类型的模型。TRL则更专注于强化学习在Transformer模型上的应用研究。项目链接
  4. Hugging Face Transformers
    • 项目简介:是一个广泛使用的自然语言处理库,提供了大量的预训练模型和工具,方便用户进行各种自然语言处理任务。它为许多项目提供了基础支持,LLaMA – Factory也在一定程度上依赖于Hugging Face Transformers库。然而,Hugging Face Transformers更侧重于提供通用的模型和工具,而LLaMA – Factory则针对大语言模型的微调进行了专门的优化和整合,提供了更便捷的微调流程和更多的训练方法选择。项目链接

环境配置

软件依赖

  1. Python:该项目要求Python版本至少为3.8,推荐使用3.11。Python作为项目的核心运行环境,其版本的适配性直接影响到项目中各类库的兼容性与运行效率。例如,某些较新的库特性可能仅在Python 3.11及以上版本中得到支持,如果使用过低版本,可能导致部分功能无法正常实现。
  2. PyTorch:最低版本为1.13.1,推荐2.4.0。PyTorch是深度学习领域常用的框架,LLaMA – Factory项目中的模型训练、推理等核心功能高度依赖PyTorch。高版本的PyTorch通常在性能优化、新特性支持方面有较大优势,如更好的分布式训练支持等。
  3. Transformers:版本需4.41.2及以上,推荐4.43.4。Hugging Face的Transformers库提供了丰富的预训练模型和工具,方便进行模型的加载、微调等操作。新版本的Transformers库会不断修复bug、提升性能以及支持更多新模型。
  4. Datasets:最低2.16.0,推荐2.20.0。该库用于管理和处理项目中的各类数据集,新版本在数据加载、处理效率以及对新数据集格式的支持上有所改进。
  5. Accelerate:0.30.1及以上,推荐0.32.0。Accelerate库有助于在不同硬件环境下加速模型训练,它能自动处理分布式训练、混合精度训练等复杂操作,提升训练效率。
  6. PEFT:0.11.1及以上,推荐0.12.0。PEFT(Parameter – Efficient Fine – Tuning)库使得在微调大语言模型时能够高效利用参数,减少内存需求和计算量,是LLaMA – Factory实现多种微调方式的重要依赖。
  7. TRL:0.8.6及以上,推荐0.9.6。TRL(Transformer Reinforcement Learning)库为基于Transformer的强化学习提供了工具,对于项目中涉及到的强化学习微调方法至关重要。

可选依赖

  1. CUDA:若使用GPU进行训练,最低版本11.6,推荐12.2。CUDA是NVIDIA推出的并行计算平台和编程模型,能够显著加速深度学习计算。高版本的CUDA通常对新的GPU架构有更好的支持,能充分发挥硬件性能。
  2. DeepSpeed:最低0.10.0,推荐0.14.0。DeepSpeed是一个深度学习优化库,支持大规模模型的高效训练,如提供更优化的内存管理、分布式训练策略等。
  3. BitsAndBytes:0.39.0及以上,推荐0.43.1。该库用于量化训练,能够在减少内存使用的同时保持模型性能,对于在资源有限的情况下进行模型训练非常有帮助。
  4. vLLM:0.4.3及以上,推荐0.5.0。vLLM为项目提供了更快的推理速度,支持并发推理,提升了模型的响应效率。
  5. Flash – Attention:2.3.0及以上,推荐2.6.3。Flash – Attention通过优化注意力计算,提高了训练效率,特别是在处理长序列数据时效果显著。

安装

克隆项目

首先,通过以下命令克隆项目仓库:

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

--depth 1参数用于仅克隆最近的一次提交,可显著减少下载时间和存储空间。

安装依赖

使用以下命令安装项目所需的依赖:

pip install -e ".[torch,metrics]"

这里的[torch,metrics]表示额外安装与torch和metrics相关的依赖。如果想安装其他额外依赖,如deepspeedliger - kernel等,可在[]中添加相应名称。

Windows用户特殊安装

  1. 安装BitsAndBytes:若要在Windows平台启用量化的LoRA(QLoRA),需安装预构建版本的bitsandbytes库。根据CUDA版本选择合适的发布版本,使用以下命令安装:
pip install https://github.com/jllllll/bitsandbytes - windows - webui/releases/download/wheels/bitsandbytes - 0.41.2.post2 - py3 - none - win_amd64.whl
  1. 安装Flash Attention – 2:要在Windows平台启用FlashAttention – 2,需安装预编译的flash – attn库。根据需求从flash - attention下载相应版本。

Ascend NPU用户特殊安装

  1. 升级Python:将Python升级到3.10或更高版本,并指定额外依赖:
pip install -e ".[torch - npu,metrics]"
  1. 安装Ascend CANN Toolkit和Kernels:按照安装教程操作,或使用以下命令:
# 替换url为对应CANN版本和设备的链接
# 安装CANN Toolkit
wget https://ascend - repo.obs.cn - east - 2.myhuaweicloud.com/Milan - ASL/Milan - ASL%20V100R001C17SPC701/Ascend - cann - toolkit_8.0.RC1.alpha001_linux - "$(uname - i)".run
bash Ascend - cann - toolkit_8.0.RC1.alpha001_linux - "$(uname - i)".run --install
# 安装CANN Kernels
wget https://ascend - repo.obs.cn - east - 2.myhuaweicloud.com/Milan - ASL/Milan - ASL%20V100R001C17SPC701/Ascend - cann - kernels - 910b_8.0.RC1.alpha001_linux.run
bash Ascend - cann - kernels - 910b_8.0.RC1.alpha001_linux.run --install
# 设置环境变量
source /usr/local/Ascend/ascend - toolkit/set_env.sh
  1. 安装BitsAndBytes用于QLoRA
    • 手动编译bitsandbytes:参考NPU版本的bitsandbytes安装文档完成编译和安装。编译要求cmake版本至少3.22.1,g++版本至少12.x。
# 从源码安装bitsandbytes
# 克隆bitsandbytes仓库,Ascend NPU后端当前在multi - backend - refactor分支启用
git clone -b multi - backend - refactor https://github.com/bitsandbytes - foundation/bitsandbytes.git
cd bitsandbytes/
# 安装依赖
pip install -r requirements - dev.txt
# 安装编译工具依赖,此步骤命令可能因操作系统而异,以下为参考
apt - get install -y build - essential cmake
# 编译并安装
cmake -DCOMPUTE_BACKEND=npu -S.
make
pip install.

从主分支安装transformers:

git clone -b https://github.com/huggingface/transformers.git
cd transformers
pip install.
- 在配置中设置`double_quantization: false`。

使用

数据准备

  1. 数据集格式:请参考data/README.md查看数据集文件格式的详细信息。数据集可以使用HuggingFace、ModelScope、Modelers hub上的,也可以从本地磁盘加载。
  2. 自定义数据集:若使用自定义数据集,需更新data/dataset_info.json

快速上手

  1. LoRA微调:使用以下命令对Llama3 – 8B – Instruct模型进行LoRA微调:
llamafactory - cli train examples/train_lora/llama3_lora_sft.yaml
  1. 推理:运行以下命令进行推理:
llamafactory - cli chat examples/inference/llama3_lora_sft.yaml
  1. 合并:使用该命令合并模型:
llamafactory - cli export examples/merge_lora/llama3_lora_sft.yaml

如需查看高级用法(包括分布式训练),可参考examples/README.md。使用llamafactory - cli help可显示帮助信息。

使用LLaMA Board GUI进行微调

通过以下命令启动基于Gradio的LLaMA Board GUI进行微调:

llamafactory - cli webui

该界面提供了可视化的操作方式,方便用户进行模型训练的参数设置、监控训练过程等。

构建Docker

  1. CUDA用户
cd docker/docker - cuda/
docker compose up -d
docker compose exec llamafactory bash
  1. Ascend NPU用户
cd docker/docker - npu/
docker compose up -d
docker compose exec llamafactory bash
  1. AMD ROCm用户
cd docker/docker - rocm/
docker compose up -d
docker compose exec llamafactory bash

如果不使用Docker Compose构建,也可使用以下命令:
1. CUDA用户

docker build -f./docker/docker - cuda/Dockerfile 
    --build - arg INSTALL_BNB=false 
    --build - arg INSTALL_VLLM=false 
    --build - arg INSTALL_DEEPSPEED=false 
    --build - arg INSTALL_FLASHATTN=false 
    --build - arg PIP_INDEX=https://pypi.org/simple 
    -t llamafactory:latest.
docker run -dit --gpus=all 
    -v./hf_cache:/root/.cache/huggingface 
    -v./ms_cache:/root/.cache/modelscope 
    -v./om_cache:/root/.cache/openmind 
    -v./data:/app/data 
    -v./output:/app/output 
    -p 7860:7860 
    -p 8000:8000 
    --shm - size 16G 
    --name llamafactory 
    llamafactory:latest
docker exec -it llamafactory bash
  1. Ascend NPU用户
# 根据环境选择docker镜像
docker build -f./docker/docker - npu/Dockerfile 
    --build - arg INSTALL_DEEPSPEED=false 
    --build - arg PIP_INDEX=https://pypi.org/simple 
    -t llamafactory:latest.
# 根据资源更改`device`
docker run -dit 
    -v./hf_cache:/root/.cache/huggingface 
    -v./ms_cache:/root/.cache/modelscope 
    -v./om_cache:/root/.cache/openmind 
    -v./data:/app/data 
    -v./output:/app/output 
    -v /usr/local/dcmi:/usr/local/dcmi 
    -v /usr/local/bin/npu - smi:/usr/local/bin/npu - smi 
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver 
    -v /etc/ascend_install.info:/etc/ascend_install.info 
    -p 7860:7860 
    -p 8000:8000 
    --device /dev/davinci0 
    --device /dev/davinci_manager 
    --device /dev/devmm_svm 
    --device /dev/hisi_hdc 
    --shm - size 16G 
    --name llamafactory 
    llamafactory:latest
docker exec -it llamafactory bash
  1. AMD ROCm用户
docker build -f./docker/docker - rocm/Dockerfile 
    --build - arg INSTALL_BNB=false 
    --build - arg INSTALL_VLLM=false 
    --build - arg INSTALL_DEEPSPEED=false 
    --build - arg INSTALL_FLASHATTN=false 
    --build - arg PIP_INDEX=https://pypi.org/simple 
    -t llamafactory:latest.
docker run -dit 
    -v./hf_cache:/root/.cache/huggingface 
    -v./ms_cache:/root/.cache/modelscope 
    -v./om_cache:/root/.cache/openmind 
    -v./data:/app/data 
    -v./output:/app/output 
    -v./saves:/app/saves 
    -p 7860:7860 
    -p 8000:8000 
    --device /dev/kfd 
    --device /dev/dri 
    --shm - size 16G 
    --name llamafactory 
    llamafactory:latest
docker exec -it llamafactory bash

各卷挂载说明:
hf_cache:在主机上利用Hugging Face缓存,若其他目录已存在缓存,可重新分配。
ms_cache:类似于Hugging Face缓存,供ModelScope用户使用。
om_cache:类似于Hugging Face缓存,供Modelers用户使用。
data:将数据集放在主机此目录,以便在LLaMA Board GUI中选择。
output:将导出目录设置为此位置,以便在主机上直接访问合并结果。

部署OpenAI – 风格API和vLLM

使用以下命令部署:

API_PORT=8000 llamafactory - cli api examples/inference/llama3_vllm.yaml

可访问相关页面获取API文档,示例包括图像理解、函数调用等。

从ModelScope Hub下载

若从Hugging Face下载模型和数据集有困难,可使用ModelScope:

export USE_MODELSCOPE_HUB=1 # Windows下使用 `set USE_MODELSCOPE_HUB=1`

通过指定ModelScope Hub的模型ID作为model_name_or_path来训练模型,可在ModelScope Hub找到完整的模型ID列表,如LLM - Research/Meta - Llama - 3 - 8B - Instruct

从Modelers Hub下载

同样可使用Modelers Hub下载模型和数据集:

export USE_OPENMIND_HUB=1 # Windows下使用 `set USE_OPENMIND_HUB=1`

通过指定Modelers Hub的模型ID作为model_name_or_path来训练模型,可在Modelers Hub找到完整的模型ID列表,如TeleAI/TeleChat - 7B - pt

使用W&B Logger

若要使用Weights & Biases记录实验结果,需在yaml文件中添加以下参数:

report_to: wandb
run_name: test_run # 可选

在启动训练任务时,设置WANDB_API_KEY为自己的密钥以登录W&B账户。

使用SwanLab Logger

要使用SwanLab记录实验结果,在yaml文件中添加以下参数:

use_swanlab: true
swanlab_run_name: test_run # 可选

启动训练任务时,可通过以下三种方式登录SwanLab:
– 在yaml文件中添加swanlab_api_key=<your_api_key>,并设置为自己的API密钥。
– 设置环境变量SWANLAB_API_KEY为自己的API密钥。
– 使用swanlab login命令完成登录。

 

官网:  https://huggingface.co/papers/2403.13372

项目地址:  https://github.com/hiyouga/LLaMA-Factory

© 版权声明

相关文章

暂无评论

暂无评论...