LlamaFactory 一键式LLM训练、微调工具介绍与实践

一、LlamaFactory介绍

LlamaFactory 是一个封装比较完善的LLM微调工具,它能够帮助用户快速地训练和微调大多数LLM模型。

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

1.1 简介

LlamaFactory架构

LlamaFactory主要通过Trainer类来实现训练流程,通过设置数据集、模型选型、训练类型、微调超参、模型保存,以及训练状态监控等信息,来开启训练。

支持的训练方法

支持的训练方法(这里的Pre-Training指的是增量预训练)

LlamaFactory和其他框架对比

LlamaFactory基于PEFT和TRL进行二次封装,从而可以快速开始SFT和RLHF微调。同时,引入GaLore和Unsloth等方案,能降低训练显存占用。

1.2 特性

  • 各种模型: LLaMA, LLaVA, Mistral, Mixtral-MoE, Qwen, Yi, Gemma, Baichuan, ChatGLM, Phi, etc.

  • 集成训练方法: (Continuous) pre-training, (multimodal) supervised fine-tuning, reward modeling, PPO, DPO and ORPO.

  • Scalable resources: 32-bit full-tuning, 16-bit freeze-tuning, 16-bit LoRA and 2/4/8-bit QLoRA via AQLM/AWQ/GPTQ/LLM.int8.

  • Advanced algorithms: GaLore, BAdam, DoRA, LongLoRA, LLaMA Pro, Mixture-of-Depths, LoRA+, LoftQ and Agent tuning.

  • 实用tricks: FlashAttention-2, Unsloth, RoPE scaling, NEFTune and rsLoRA.

  • 实验监控:LlamaBoard, TensorBoard, Wandb, MLflow, etc.

  • 推理集成: OpenAI-style API, Gradio UI and CLI with vLLM worker.

LlamaFactory支持单机单卡,同时整合了accelerate和deepseed的单机多卡、多机多卡分布式训练。

支持的模型
模型名模型大小Template
Baichuan2[1]7B/13Bbaichuan2
BLOOM[2]560M/1.1B/1.7B/3B/7.1B/176B-
BLOOMZ[3]560M/1.1B/1.7B/3B/7.1B/176B-
ChatGLM3[4]6Bchatglm3
Command-R[5]35B/104Bcohere
DeepSeek (MoE)[6]7B/16B/67B/236Bdeepseek
Falcon[7]7B/11B/40B/180Bfalcon
Gemma/CodeGemma[8]2B/7Bgemma
GLM4[9]9Bglm4
InternLM2[10]7B/20Bintern2
LLaMA[11]7B/13B/33B/65B-
LLaMA-2[12]7B/13B/70Bllama2
LLaMA-3[13]8B/70Bllama3
LLaVA-1.5[14]7B/13Bvicuna
Mistral/Mixtral[15]7B/8x7B/8x22Bmistral
OLMo[16]1B/7B-
PaliGemma[17]3Bgemma
Phi-1.5/2[18]1.3B/2.7B-
Phi-3[19]4B/7B/14Bphi
Qwen[20]1.8B/7B/14B/72Bqwen
Qwen1.5 (Code/MoE)[21]0.5B/1.8B/4B/7B/14B/32B/72B/110Bqwen
Qwen2 (MoE)[22]0.5B/1.5B/7B/57B/72Bqwen
StarCoder2[23]3B/7B/15B-
XVERSE[24]7B/13B/65Bxverse
Yi (1/1.5)[25]6B/9B/34Byi
Yi-VL[26]6B/34Byi_vl
Yuan[27]2B/51B/102Byuan

基于LlamaFactory框架进行的各种训练效率比较

适合进行各种LLM在不同训练方法下,效果评估对比

1.3 数据集信息

LlamaFactory配置的数据集格式。

预训练数据集
  • • Wiki Demo (en)[28]

  • • RefinedWeb (en)[29]

  • • RedPajama V2 (en)[30]

  • • Wikipedia (en)[31]

  • • Wikipedia (zh)[32]

  • • Pile (en)[33]

  • • SkyPile (zh)[34]

  • • FineWeb (en)[35]

  • • FineWeb-Edu (en)[36]

  • • The Stack (en)[37]

  • • StarCoder (en)[38]

指令微调数据集
  • • Identity (en&zh)[39]

  • • Stanford Alpaca (en)[40]

  • • Stanford Alpaca (zh)[41]

  • • Alpaca GPT4 (en&zh)[42]

  • • Glaive Function Calling V2 (en&zh)[43]

  • • LIMA (en)[44]

  • • Guanaco Dataset (multilingual)[45]

  • • BELLE 2M (zh)[46]

  • • BELLE 1M (zh)[47]

  • • BELLE 0.5M (zh)[48]

  • • BELLE Dialogue 0.4M (zh)[49]

  • • BELLE School Math 0.25M (zh)[50]

  • • BELLE Multiturn Chat 0.8M (zh)[51]

  • • UltraChat (en)[52]

  • • OpenPlatypus (en)[53]

  • • CodeAlpaca 20k (en)[54]

  • • Alpaca CoT (multilingual)[55]

  • • OpenOrca (en)[56]

  • • SlimOrca (en)[57]

  • • MathInstruct (en)[58]

  • • Firefly 1.1M (zh)[59]

  • • Wiki QA (en)[60]

  • • Web QA (zh)[61]

  • • WebNovel (zh)[62]

  • • Nectar (en)[63]

  • • deepctrl (en&zh)[64]

  • • Advertise Generating (zh)[65]

  • • ShareGPT Hyperfiltered (en)[66]

  • • ShareGPT4 (en&zh)[67]

  • • UltraChat 200k (en)[68]

  • • AgentInstruct (en)[69]

  • • LMSYS Chat 1M (en)[70]

  • • Evol Instruct V2 (en)[71]

  • • Cosmopedia (en)[72]

  • • STEM (zh)[73]

  • • Ruozhiba (zh)[74]

  • • LLaVA mixed (en&zh)[75]

  • • Open Assistant (de)[76]

  • • Dolly 15k (de)[77]

  • • Alpaca GPT4 (de)[78]

  • • OpenSchnabeltier (de)[79]

  • • Evol Instruct (de)[80]

  • • Dolphin (de)[81]

  • • Booksum (de)[82]

  • • Airoboros (de)[83]

  • • Ultrachat (de)[84]

偏好数据集
  • • DPO mixed (en&zh)[85]

  • • UltraFeedback (en)[86]

  • • Orca DPO Pairs (en)[87]

  • • HH-RLHF (en)[88]

  • • Nectar (en)[89]

  • • Orca DPO (de)[90]

  • • KTO mixed (en)[91]

部分数据集的使用需要确认,推荐使用下述命令登录 Hugging Face 账户。

pip install --upgrade huggingface_hub  
huggingface-cli login

1.4 软硬件依赖

必需项至少推荐
python3.83.11
torch1.13.12.3.0
transformers4.41.24.41.2
datasets2.16.02.19.2
accelerate0.30.10.30.1
peft0.11.10.11.1
trl0.8.60.9.4
可选项至少推荐
CUDA11.612.2
deepspeed0.10.00.14.0
bitsandbytes0.39.00.43.1
vllm0.4.30.4.3
flash-attn2.3.02.5.9

1.5 硬件依赖

* 估算值

方法精度7B13B30B70B110B8x7B8x22B
FullAMP120GB240GB600GB1200GB2000GB900GB2400GB
Full1660GB120GB300GB600GB900GB400GB1200GB
Freeze1620GB40GB80GB200GB360GB160GB400GB
LoRA/GaLore/BAdam1616GB32GB64GB160GB240GB120GB320GB
QLoRA810GB20GB40GB80GB140GB60GB160GB
QLoRA46GB12GB24GB48GB72GB30GB96GB
QLoRA24GB8GB16GB24GB48GB18GB48GB

估计的不一定准,取决于输入输出长度、batch_size。建议使用accelerate估计。

二、使用LlamaFactory

2.1 项目结构

LlamaFactory项目

  • • examples目录下,存放各种预置的例子

  • • src目录的llm-tuner是项目源码

  • • data目录下,存放各种预置的数据集,以及数据集配置文件dataset_info.json

可以在 src/llmtuner/data/template.py 中添加自己的对话模板。

为了确保和LLM SFT时一致,确保对话模板格式很关键。

2.2 数据准备

关于数据集文件的格式,请参考 data/README_zh.md[92] 的内容。你可以使用 HuggingFace / ModelScope 上的数据集或加载本地数据集。

使用自定义数据集时,请更新 data/dataset_info.json[93] 文件,进行数据集名称、数据集字段以及数据集路径的配置。

dataset_info.json的一些默认配置数据集信息

{     "alpaca_gpt4_zh": {       "file_name": "alpaca_gpt4_data_zh.json"     },     "identity": {       "file_name": "identity.json"     },     "oaast_sft_zh": {       "file_name": "oaast_sft_zh.json",       "columns": {         "prompt": "instruction",         "query": "input",         "response": "output",         "history": "history"       }     },     "lima": {       "file_name": "lima.json",       "columns": {         "prompt": "instruction",         "query": "input",         "response": "output",         "history": "history"       }     },     "belle_2m": {       "hf_hub_url": "BelleGroup/train_2M_CN",       "ms_hub_url": "AI-ModelScope/train_2M_CN"     },     "firefly": {       "hf_hub_url": "YeungNLP/firefly-train-1.1M",       "columns": {         "prompt": "input",         "response": "target"       }     },     "wikiqa": {       "hf_hub_url": "wiki_qa",       "columns": {         "prompt": "question",         "response": "answer"       }     }   }

也可以在 template.py 中添加自己的对话模板。典型的几个模板

_register_template(       name="alpaca",       format_user=StringFormatter(slots=["### Instruction:\n{{content}}\n\n### Response:\n"]),       format_separator=EmptyFormatter(slots=["\n\n"]),       default_system=(           "Below is an instruction that describes a task. "           "Write a response that appropriately completes the request.\n\n"       ),   )      _register_template(       name="qwen",       format_user=StringFormatter(slots=["<|im_start|>user\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),       format_system=StringFormatter(slots=["<|im_start|>system\n{{content}}<|im_end|>\n"]),       format_observation=StringFormatter(slots=["<|im_start|>tool\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),       format_separator=EmptyFormatter(slots=["\n"]),       default_system="You are a helpful assistant.",       stop_words=["<|im_end|>"],       replace_eos=True,   )      _register_template(       name="chatml",       format_user=StringFormatter(slots=["<|im_start|>user\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),       format_system=StringFormatter(slots=["<|im_start|>system\n{{content}}<|im_end|>\n"]),       format_observation=StringFormatter(slots=["<|im_start|>tool\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),       format_separator=EmptyFormatter(slots=["\n"]),       stop_words=["<|im_end|>", "<|im_start|>"],       replace_eos=True,   )      _register_template(       name="deepseek",       format_user=StringFormatter(slots=["User: {{content}}\n\nAssistant:"]),       format_system=StringFormatter(slots=[{"bos_token"}, "{{content}}"]),       force_system=True,   )      _register_template(       name="default",       format_user=StringFormatter(slots=["Human: {{content}}\nAssistant: "]),       format_system=StringFormatter(slots=["{{content}}\n"]),       format_separator=EmptyFormatter(slots=["\n"]),   )      _register_template(       name="llama2",       format_user=StringFormatter(slots=[{"bos_token"}, "[INST] {{content}} [/INST]"]),       format_system=StringFormatter(slots=["<<SYS>>\n{{content}}\n<</SYS>>\n\n"]),       default_system=(           "You are a helpful, respectful and honest assistant. "           "Always answer as helpfully as possible, while being safe. "           "Your answers should not include any harmful, unethical, "           "racist, sexist, toxic, dangerous, or illegal content. "           "Please ensure that your responses are socially unbiased and positive in nature.\n\n"           "If a question does not make any sense, or is not factually coherent, "           "explain why instead of answering something not correct. "           "If you don't know the answer to a question, please don't share false information."       ),   )      _register_template(       name="llama2_zh",       format_user=StringFormatter(slots=[{"bos_token"}, "[INST] {{content}} [/INST]"]),       format_system=StringFormatter(slots=["<<SYS>>\n{{content}}\n<</SYS>>\n\n"]),       default_system="You are a helpful assistant. 你是一个乐于助人的助手。",   )      _register_template(       name="llama3",       format_user=StringFormatter(           slots=[               (                   "<|start_header_id|>user<|end_header_id|>\n\n{{content}}<|eot_id|>"                   "<|start_header_id|>assistant<|end_header_id|>\n\n"               )           ]       ),       format_system=StringFormatter(           slots=[{"bos_token"}, "<|start_header_id|>system<|end_header_id|>\n\n{{content}}<|eot_id|>"]       ),       format_observation=StringFormatter(           slots=[               (                   "<|start_header_id|>tool<|end_header_id|>\n\n{{content}}<|eot_id|>"                   "<|start_header_id|>assistant<|end_header_id|>\n\n"               )           ]       ),       default_system="You are a helpful assistant.",       stop_words=["<|eot_id|>"],       replace_eos=True,   )

2.3 安装依赖

在一个干净的虚拟环境,安装如下依赖

git clone https://github.com/hiyouga/LLaMA-Factory.git   conda create -n llama_factory python=3.10   conda activate llama_factory   cd LLaMA-Factory   pip install -e .[metrics]

可选的额外依赖项:deepspeed、metrics、unsloth、galore、badam、vllm、bitsandbytes、gptq、awq、aqlm、qwen、modelscope、quality

2.4 WEB-UI 训练

LlamaFactory Colab Demo脚本:

https://colab.research.google.com/drive/1eRTPn37ltBbYsISy9Aw2NuI2Aq5CQrD9?usp=sharing

ui界面目前只支持单卡训练

模型选择

数据集选择配置

数据预览

训练方式选择

预训练, SFT, 奖励模型训练,PPO/DPO/ORPO)

训练参数配置

预览训练命令

日志展示

模型加载+数据处理

训练过程展示

2.5 命令脚本训练

目前,最新版本绝大多数examples已改成yaml配置文件,而不是shell命令用parser读取参数了.

当然,本质上就是把训练参数传到train.py中

examples下的训练命令

examples下的lora_single_gpu/llama3_lora_sft.yaml

# model   model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct      # method   stage: sft   do_train: true   finetuning_type: lora   lora_target: q_proj,v_proj      # dataset   dataset: identity,alpaca_gpt4_en   template: llama3   cutoff_len: 1024   max_samples: 1000   overwrite_cache: true   preprocessing_num_workers: 16      # output   output_dir: saves/llama3-8b/lora/sft   logging_steps: 10   save_steps: 500   plot_loss: true   overwrite_output_dir: true      # train   per_device_train_batch_size: 1   gradient_accumulation_steps: 8   learning_rate: 0.0001   num_train_epochs: 3.0   lr_scheduler_type: cosine   warmup_steps: 0.1   fp16: true      # eval   val_size: 0.1   per_device_eval_batch_size: 1   evaluation_strategy: steps   eval_steps: 500

脚本 examples/lora_multi_gpu/multi_node.sh

#!/bin/bash   # also launch it on slave machine using slave_config.yaml      CUDA_VISIBLE_DEVICES=0,1,2,3 accelerate launch \       --config_file examples/accelerate/master_config.yaml \       src/train.py examples/lora_multi_gpu/llama3_lora_sft.yaml

之前一个训练日志:

配置了几个数据集,进行单机多卡 llama3_8b_instruct进行中文数据集sft训练

llama3_8b_instruct进行增量预训练还是中文数据SFT都不过是倒腾数据集和配置脚本的事情,当然这只是踏出训练的第一步。

毕竟搞出一个baseline和能训练好还是两码事(需要自己调参摸索,更需要学习开源的经验)。

总结

LlamaFactory适合快速进行全参数、LoRA等高效微调,适合增量预训练、指令微调和强化学习微调。

它具备可视化界面,同时集成了多种比较前沿的训练Trick,用的人多。

但是呢,由于集成地太好,隐藏了很多细节,一方面不利于学习和定制化。另一方面,在使用的时候,也需要详细了解参数配置。

LlamaFactory适合快速上手,毕竟它已经集成好的框架将分散的包组合到一起,能够省时省力,但用好需花一点精力。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

在这里插入图片描述
在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型落地应用案例PPT👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)

在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值