LLaMa-Factory应用到实战(二)

LLaMa-Factory应用到实战(二)

文章目录

序言

文章整体分为八个章节,本篇覆盖[6-8]章

前三个章节是基础知识:

  • 第一章是对LLaMA-Factory的整体介绍
  • 第二章说明LLaMA-Factory使用的数据格式
  • 第三章说明怎样获取基座模型

四五两个章节通过一个法律文书摘要项目介绍LLaMA-Factory进行LoRA微调训练、评估和部署的全流程

  • 第四章介绍LoRA微调的全过程
  • 第五章介绍模型评估和部署

六七八三个章节是对LLaMA-Factory的扩展介绍

  • 第六章详细解释LLaMA-Factory的webui界面上的所有参数和方法
  • 第七章介绍模型合并和量化
  • 第八章介绍分布式训练

六、webui详解

1.基座模型

在这里插入图片描述


这一组参数定义了基座模型:

字段说明
模型名称这里是模型支持的所有基座模型的列表,模型本体需要自己手动下载。注意这里有部分模型的名称是不够明确的,例如DeepSeek-R1-7B-Distill,这个名称只说明了模型把DeepSeek-R1当作教师模型,学习了它的推理数据,却没说明学生模型具体是哪个。
模型路径模型在本地的存储路径。
检查点路径如果是从某个检查点(checkpoint)继续训练,填写检查点在本地的存储路径。如果不是,置空。
对话模板不同模型的对话模板会有差异,尽量选同系列模型,至少是相近模型的模板,否则有可能报错。

2.数据集

在这里插入图片描述


这一组参数定义了训练用的数据集

字段说明
数据路径本地存储训练数据和dataset_info.json文件的路径
数据集dataset_info.json里定义的数据集名称
{
“chat-train”: { #数据集名称
“file_name”: “train.jsonl” #数据集文件
}
}

3. 训练阶段

在这里插入图片描述


训练阶段的这几个选项不是并列关系

训练阶段说明
Pre-Training这是大模型的起步阶段
Supervised Fine-Tuning有监督训练
Reward ModelingRLHF(人类反馈强化学习)的第一步,训练奖励模型
PPORLHF(人类反馈强化学习)的第二步,通过奖励模型的反馈,调整自身策略
DPO直接利用人类偏好数据微调AI
KTO在训练AI时,会‌不对称地处理正负反馈(惩罚错误比奖励正确更严厉)

下面详细说明一下RLHF(Reward Modeling+PPO),DPO,KTO这三种强化学习方法

3.1 RLHF(Reward Modeling+PPO)

RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)的训练方式是:

  • 首先训练一个初始模型
  • 利用初始模型对同一个数据集,生成多样化的回答
  • 人类对多样化回答进行排序、评分、修正
  • 利用人类修正后的数据训练奖励模型
  • 把初始模型作为“策略”,奖励模型作为“环境”,使用PPO等算法,优化初始模型。

其中的PPO(Proximal Policy Optimization,近端策略优化)是一种训练AI模型的强化学习算法,用于让AI通过"试错"学习最优策略。

核心思想是让初始模型尝试不同的动作,根据奖励模型的反馈(奖励/惩罚)调整策略。

关键点在于每次更新策略时,只允许小幅调整(避免“学崩”,这也是“近端”这个词的由来),像给学习过程加了“安全绳”。

主要用途是ChatGPT的微调、游戏AI、机器人控制等。

3.2 DPO

DPO(Direct Preference Optimization,直接偏好优化)是一种直接利用人类偏好数据微调AI的方法(无需复杂奖励模型)。

核心思想传统RL(如PPO)需要先训练一个“奖励模型”,再调整AI策略;DPO跳过这一步,直接用人类标注的“A回答比B好”这类偏好数据训练。

优点更简单高效,适合对齐人类价值观(比如让AI回答更友善)。

主要用途是专攻“人类偏好”场景。可以看作RLHF的简化版本

3.3 KTO

KTO(Kahneman-Tversky Optimization,卡尼曼-特沃斯基优化)是一种结合行为经济学理论的AI训练方法,灵感来自诺贝尔奖得主卡尼曼的“前景理论”。

核心思想是人类对“损失”比“收益”更敏感(比如丢100元的痛苦 > 捡100元的快乐)。所以KTO在训练AI时,会‌不对称地处理正负反馈(惩罚错误比奖励正确更严厉)。

主要用途是快速纠正AI的不良行为(不文明用语、种族歧视、安全漏洞等)

3.4 小结

问题:
1 怎样使用LLaMA-Factory做RLHF训练?

2 DPO和KTO的使用场景是什么?

4. 训练方法

在这里插入图片描述


在这里插入图片描述

5.量化

在这里插入图片描述
量化等级说明
none不做量化
88位量化
44位量化

下面对几种量化方法做简单说明

5.1 bitsandbytes(8-bit/4-bit量化)

‌核心思想:把模型参数从‌32位浮点数压缩成‌8位整数或‌4位整数,大幅减少内存占用。

特点:

  • 即插即用‌:Hugging Face直接集成,加一行代码就能用。
  • 保持性能‌:8-bit量化几乎不掉精度,4-bit会轻微下降。
  • 适合场景‌:消费级显卡(如RTX 3090)跑大模型。

‌类比:像把高清电影压缩成MP4:

  • 8-bit ≈ 720P(画质几乎不变,体积减半)。
  • 4-bit ≈ 480P(画质稍糊,但手机也能播)。

5.2 HQQ(Half-Quadratic Quantization,半二次量化)

核心思想:用‌数学优化方法动态分配量化位数,对重要参数保留高精度,次要参数狠压缩。

特点

  • 灵活智能‌:不同参数用不同位数(比如2-bit到8-bit混合)。
  • 计算复杂‌:需要额外优化步骤,但压缩率更高。
  • 适合场景‌:对体积极度敏感的端侧设备(手机、IoT)。

类比‌:像搬家时打包行李:

  • 贵重瓷器(重要参数)→ 精装泡沫箱(8-bit)。
  • 旧衣服(次要参数)→ 真空压缩袋(2-bit)。

5.3 EETQ(Efficient Engine for Tensor Quantization,高效张量量化引擎)

核心思想:专为‌GPU推理加速设计的量化库,优化计算过程。

特点

  • 极致速度‌:内核级优化,比常规量化快2-3倍。
  • 需要适配‌:需手动转换模型格式,兼容性较低。
  • 适合场景‌:高并发在线服务(如ChatGPT接口)。

‌类比:像F1赛车改装:

  • 普通量化 → 家用车省油改装。
  • EETQ → 拆座椅、换涡轮,只为冲赛道极限速度。

5.4 适用场景

方法易用性压缩率速度典型用途
bitsandbytes⭐⭐⭐⭐⭐⭐⭐⭐个人快速部署
HQQ⭐⭐⭐⭐⭐⭐手机/嵌入式设备
EETQ⭐⭐⭐⭐⭐⭐企业级高性能推理

‌一句话总结:

  • 想简单试试 → bitsandbytes
  • 要极限压缩 → HQQ
  • 追求推理速度 → EETQ

5.5 小结

问题:

1 bitsandbytes、HQQ、EETQ三种量化方法的使用场景是什么?

6. 加速算法

在这里插入图片描述


注意:这里的FlashAttention-2用于训练和推理,Unsloth用于训练,Liger Kernel用于推理,他们不是并列关系,可以组合使用。

6.1 FlashAttention-2

核心目标:优化Transformer的‌注意力计算(避免重复读写显存)。

原理

  • 传统注意力计算时,GPU显存频繁读写成瓶颈(像反复翻书找知识点)。
  • FlashAttention-2通过‌算法重构+硬件适配‌,让计算更“连贯”,减少显存访问次数。

效果

  • 训练速度提升2-3倍,显存占用降低。
  • ‌适合场景:所有基于Transformer的模型(如LLaMA、GPT)。

类比‌:像学霸改进学习方法:

  • 旧方法:每道题都翻课本查公式(显存频繁读写)。
  • FlashAttention-2:一次性记住所有公式,快速解题(计算更高效)。

6.2 Unsloth

核心目标:让‌微调(Fine-tuning)大模型更快、更省显存。

原理

  • 结合多种技巧:‌梯度检查点‌(省显存)、‌自动混合精度‌(加速计算)、‌内核融合‌(减少GPU操作步骤)。
  • 对PyTorch底层计算进行定制优化。

效果

  • 微调速度提升2-5倍,显存需求减半。
  • ‌适合场景:个人电脑微调大模型(如用RTX 4090训练LLaMA)。

类比‌:像给汽车加装涡轮增压:

  • 原厂PyTorch → 普通发动机。
  • Unsloth → 涡轮+轻量化改装,同样的油跑得更快。

6.3 Liger Kernel

核心目标:专为‌推理阶段设计的GPU加速库。

原理

  • 针对推理的‌批量请求‌优化,动态合并计算任务(如同时处理10个用户的提问)。
  • 高度定制CUDA内核,避免无用计算。

效果

  • 推理吞吐量(每秒处理量)提升5-10倍,延迟更低。
  • 适合场景‌:高并发在线服务(如ChatGPT API)。

类比‌:像快餐店出餐流程优化:

  • 传统推理 → 一个订单做完再做下一个。
  • Liger Kernel → 批量接单,同时炸10份薯条,整体效率飙升。

6.4 适用场景

技术适用阶段优化重点典型用户
FlashAttention-2训练/推理注意力计算研究者、企业
Unsloth训练微调效率个人开发者
Liger Kernel推理高并发吞吐量云服务厂商

‌一句话总结:

  • 想改进模型底层计算 → ‌FlashAttention-2
  • 想低成本微调模型 → ‌Unsloth
  • 要做高并发AI服务 → ‌Liger Kernel

6.5 小结

问题:

1 FlashAttention-2、Unsloth、Liger Kernel三种加速方法的原理和使用场景是什么?

7. RoPE插值方法

在这里插入图片描述


RoPE(Rotary Position Embedding,旋转位置编码)

RoPE Scaling 是一种让 ‌大语言模型(LLM)‌ 处理 ‌超长文本‌ 的技术,就像给模型“加长记忆”,让它能读懂更长的文章或对话。

四种Scaling方法对比

7.1 Linear(线性缩放)

  • 原理‌:简单粗暴,把位置编号按比例缩小(比如编号1000→压缩成500)。
  • 例子‌:原模型支持2048长度,想扩展到4096,就把所有位置编号除以2。
  • 缺点‌:太生硬,长文本效果差(模型会懵)。

7.2 Dynamic(动态缩放)

    • 原理‌:训练时用短文本,推理时自动按比例缩放位置编码。
  • 优点‌:不用重新训练模型,直接支持更长文本(比如ChatGPT初期用的方法)。
  • 缺点‌:超过一定长度(比如原长的4倍)效果变差。

7.3 YaRN(NTK-aware RoPE Scaling)

  • 原理‌:用神经切线核(NTK)理论动态调整旋转角度,兼顾短文本和长文本。
  • 优点‌:比Linear和Dynamic更聪明,扩展性更强(比如支持8倍长度)。
  • 应用‌:LLaMA-2 的官方长文本扩展方法。

7.4 LLaMA-3 的改进

  • 特点‌:结合了YaRN和动态调整,进一步优化长文本稳定性。
  • 效果‌:在超长文本(比如10万token)下仍能保持较好性能。

7.5 一句话总结

  • Linear‌:简单压缩,效果差。
  • Dynamic‌:推理时自动缩放,方便但有限。
  • YaRN‌:用数学理论智能调整,效果更好。
  • LLaMA-3‌:在YaRN基础上继续升级,专治超长文本。‌

7.6 小结

问题:

1 RoPE的插值方法有哪些?使用场景是什么?

8. 通用参数

在这里插入图片描述

这一组是通用参数,几乎训练任何大模型都会用到

参数名称说明
学习率0.1 一般只用于探索,没人会真的用
0.01 从头训练的标准模型初始学习率
0.001 已经快接近优化目标时做细致调整时采用
0.0001 模型接近收敛时做微调
0.00005 预训练阶段的最后微调
训练轮数学习的特性较简单 ,1轮即可,如果数据集太小,不应选择太多轮数,可以考虑数据增强。
最大梯度范数指定一个允许的最大梯度值,防止梯度爆炸
最大样本数训练时从数据集里最多取这个数量的样本
计算类型fp32:单精度浮点数,32位,计算准确、稳定,但速度慢、占显存最多。
fp16:半精度浮点数,16位,显存省一半,计算速度快,但容易溢出 。
bf16:脑浮点数,16位,显存省一半,计算速度快,不容易溢出。
pure_bf16 纯bf16模式,16位,显存占用最小,但需要硬件支持。
截断长度输入样本的截断长度
批处理大小根据显存的情况调整
梯度累计批处理大小*梯度累计决定了梯度更新的频率
验证集比例验证集占全体样本的比例
学习率调节器模型训练的不同阶段需要不同的学习率,这个参数决定学习率的调节器,cosin最常用

8.1 小结

问题:
1 怎样选择学习率?

​ 2 计算类型都有哪些?默认情况下用哪个?

​ 3 批处理大小怎样选择?

​ 4 处理完多少样本后做梯度更新?

9. 其它参数

在这里插入图片描述

这组参数里最重要的就是保存间隔和预热部署

10. 部分参数微调设置

这一组参数只有微调方法为freeze的时候才启用,指定哪些层和模块可以参与训练。

在这里插入图片描述

11. LoRA参数设置

这一组参数只有微调方法为lora的时候才启用,指定哪些层和模块可以参与训练。

在这里插入图片描述
参数说明
LoRA的秩LoRA矩阵的秩
LoRA缩放系数LoRA缩放系数的大小
LoRA随机丢弃LoRA权重随即丢弃的概率
LoRA+学习率比例允许A,B两个矩阵的学习率不一样,在 LoRA+ 中,适配器矩阵 A 的学习率 ηA 即为优化器学习率。适配器矩阵 B 的学习率 ηBλ * ηA。 其中 λloraplus_lr_ratio 的值。
使用rslora在LoRA训练的时候可以动态调整LoRA缩放系数
使用DoRA把原始权重分继承幅度和方向两部分,同时优化,微调更灵活
使用PiSSA直接调整权重矩阵的主成分,减少计算量

11.1 小结

问题:
1 LoRA训练哪个参数决定了计算量大小?
2 未知场景下,原始LoRA,rslora,DoRA,PiSSA四者中优先使用哪个?

12. RLHF参数设置

在这里插入图片描述


这一组参数只有训练阶段为强化学习的时候才启用。

在这里插入图片描述

13. 多模态参数设置

在这里插入图片描述


这一组参数只有训练阶段为强化学习的时候才启用。

14.GaLore参数设置

GaLore是为大模型全参数训练、微调场景设计的优化工具,它使用中非常节省显存的优化器。核心思路是把传统优化器的超大规模参数矩阵,拆解成低秩形式,大幅降低计算量。

在这里插入图片描述


在这里插入图片描述

15.APOLLO参数设置

APOLLO优化器是升级版的Adam或SGD,Adam虽然能自适应学习率,但可能在某些任务上震荡或收敛不稳定;SGD需要手动调节学习率,容易陷入局部最优。APOLLO采用了自适应学习率,不仅考虑到梯度,还考虑到二阶信息,调节效果更好。

在这里插入图片描述


在这里插入图片描述

16. BAdam参数设置

BAdam优化器是升级版的Adam,传统的Adam,当参数接近边界时,可能会越界导致概率值变成-1或者大于1的值,也可能导致物理常数超出合理范围。BAdam专门解决训练时参数超出合理范围的问题,当参数接近边界时,更新率自动调低。

在这里插入图片描述


在这里插入图片描述

17. 模型和配置的保存路径

在这里插入图片描述

18. SwanLab参数设置

这一组参数只有使用SwanLab的时候才启用

在这里插入图片描述

19. 预测与评估

在这里插入图片描述

20.推理

在这里插入图片描述

21.导出模型

在这里插入图片描述

22.小结

问题:
1 LLaMa-Factory可以做哪些阶段的训练?有哪些训练方法?
2 LLaMa-Factory可以使用哪些训练方法?适用场景是什么?
3 LLaMa-Factory可以使用哪些加速方法?适用场景是什么?
4 LLaMa-Factory可以使用插值方法?各有什么优缺点?
5 LLaMa-Factory有哪些LoRA微调的专用参数?作用是什么?
6 LLaMa-Factory能训练多模态模型吗?如果只想训练多模态模型中的图像部分,不想训练其中的文本和文图映射,应该怎样设置参数?

七、LoRA模型合并和量化

1. 模型合并

做LoRA微调的时候,如果有全精度模型和更大的量化模型,应该尽可能选择更大的量化模型。因为低精度对模型效果影响有限,但是对占用显存,推理速度有巨大影响。
模型合并只能使用全精度模型,而量化模型的基座和LoRA即使不合并影响也不大,反而还有部署灵活的优势,所以模型合并这个操作使用频率较低。

1.1 使用webui

![


在这里插入图片描述

1.2 使用命令行

如果必须使用全精度模型,训练完成后,可以选择把LoRA和基座模型进行合并

llamafactory-cli export merge_config.yaml 

配置文件格式如下:

#基座模型路径 model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct #LoRA路径 adapter_name_or_path: saves/llama3-8b/lora/sft #对话模板 template: llama3 #微调类型 finetuning_type: lora #合并后模型路径 export_dir: models/llama3_lora_sft #模型文件切割的大小(GB) export_size: 2#导出的设备 export_device: cpu #导出的文件格式 True: .bin 格式保存。 False: .safetensors 格式保存。 export_legacy_format: false

2. 模型量化

2.1 使用webui

在这里插入图片描述

2.2 使用命令行

llamafactory-cli export quantization_config.yaml 

配置文件格式如下:

#基座模型路径 model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct #对话模板 template: llama3 #合并后模型路径 export_dir: models/llama3_gptq #量化等级 export_quantization_bit: 4 #量化校验数据集 export_quantization_dataset: data/c4_demo.json #模型文件切割的大小(GB) export_size: 2 #导出的设备 export_device: cpu #导出的文件格式 True: .bin 格式保存。 False: .safetensors 格式保存。 export_legacy_format: false 

3. 小结

实操:
1 将一个LoRA和基座模型做合并
2 将一个全精度模型做量化

八、分布式训练

1. 整体介绍

LLaMA-Factory 支持单机多卡和多机多卡分布式训练。同时也支持 DDP , DeepSpeed 和 FSDP 三种分布式引擎。
DDP (DistributedDataParallel) 通过实现模型并行和数据并行实现训练加速。 使用 DDP 的程序需要生成多个进程并且为每个进程创建一个 DDP 实例,他们之间通过 torch.distributed 库同步。
DeepSpeed 是微软开发的分布式训练引擎,并提供ZeRO(Zero Redundancy Optimizer)、offload、Sparse Attention、1 bit Adam、流水线并行等优化技术。 您可以根据任务需求与设备选择使用。
FSDP通过全切片数据并行技术(Fully Sharded Data Parallel)来处理更多更大的模型。在 DDP 中,每张 GPU 都各自保留了一份完整的模型参数和优化器参数。而 FSDP 切分了模型参数、梯度与优化器参数,使得每张 GPU 只保留这些参数的一部分。 除了并行技术之外,FSDP 还支持将模型参数卸载至CPU,从而进一步降低显存需求。

在这里插入图片描述

2. DPP

NativeDDP 是 PyTorch 提供的一种分布式训练方式,您可以通过以下命令启动训练:

2.1 单机多卡

  • 使用llamafactory-cli启动DPP

您可以使用 llamafactory-cli 启动 NativeDDP 引擎。

FORCE_TORCHRUN=1 llamafactory-cli train examples/train_full/llama3_full_sft_ds3.yaml 

如果 CUDA_VISIBLE_DEVICES 没有指定,则默认使用所有GPU。如果需要指定GPU,例如第0、1个GPU,可以使用:

FORCE_TORCHRUN=1 CUDA_VISIBLE_DEVICES=0,1 llamafactory-cli train config/config1.yaml 
  • 使用torchrun启动DPP

您也可以使用 torchrun 指令启动 NativeDDP 引擎进行单机多卡训练。下面提供一个示例:

torchrun --standalone --nnodes=1 --nproc-per-node=8 src/train.py \ --stage sft \ --model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \ --do_train \ --dataset alpaca_en_demo \ --template llama3 \ --finetuning_type lora \ --output_dir saves/llama3-8b/lora/ \ --overwrite_cache \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 100 \ --save_steps 500 \ --learning_rate 1e-4 \ --num_train_epochs 2.0 \ --plot_loss \ --bf16 
  • 使用accelerate启动DPP

您还可以使用 accelerate 指令启动进行单机多卡训练。
首先运行以下命令,根据需求回答一系列问题后生成配置文件:
accelerate config
下面提供一个示例配置文件:

#accelerate_singleNode_config.yaml compute_environment: LOCAL_MACHINE debug: true distributed_type: MULTI_GPU downcast_bf16: 'no' enable_cpu_affinity: false gpu_ids: all machine_rank: 0 main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 8 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false 您可以通过运行以下指令开始训练: accelerate launch \ --config_file accelerate_singleNode_config.yaml \ src/train.py training_config.yaml 

2.2 单机多卡

  • 使用llamafactory-cli启动DPP
FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=0 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 \ llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=1 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 \ llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml 
在这里插入图片描述
  • 使用torchrun启动DPP

您也可以使用 torchrun 指令启动 NativeDDP 引擎进行多机多卡训练。

  • 使用accelerate启动DPP

您还可以使用 accelerate 指令启动进行多机多卡训练。
首先运行以下命令,根据需求回答一系列问题后生成配置文件:
accelerate config
下面提供一个示例配置文件:

#accelerate_multiNode_config.yaml compute_environment: LOCAL_MACHINE debug: true distributed_type: MULTI_GPU downcast_bf16: 'no' enable_cpu_affinity: false gpu_ids: all machine_rank: 0 main_process_ip: '192.168.0.1' main_process_port: 29500 main_training_function: main mixed_precision: fp16 num_machines: 2 num_processes: 16 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false 

您可以通过运行以下指令开始训练:

accelerate launch \ --config_file accelerate_multiNode_config.yaml \ train.py llm_config.yaml 

2.3 小结

实操:
1 实操基于DPP的单机多卡训练
2 实操基于DPP的多机多卡训练

3. DeepSpeed

DeepSpeed 是由微软开发的一个开源深度学习优化库,旨在提高大模型训练的效率和速度。在使用 DeepSpeed 之前,您需要先估计训练任务的显存大小,再根据任务需求与资源情况选择合适的 ZeRO 阶段。

  • ZeRO-1: 仅划分优化器参数,每个GPU各有一份完整的模型参数与梯度。
  • ZeRO-2: 划分优化器参数与梯度,每个GPU各有一份完整的模型参数。
  • ZeRO-3: 划分优化器参数、梯度与模型参数。

简单来说:从 ZeRO-1 到 ZeRO-3,阶段数越高,显存需求越小,但是训练速度也依次变慢。此外,设置 offload_param=cpu 参数会大幅减小显存需求,但会极大地使训练速度减慢。因此,如果您有足够的显存, 应当使用 ZeRO-1,并且确保 offload_param=none。

3.1 单机多卡

  • 使用llamafactory-cli启动DeepSpeed

您可以使用 llamafactory-cli 启动 DeepSpeed 引擎进行单机多卡训练。

FORCE_TORCHRUN=1 llamafactory-cli train examples/train_full/llama3_full_sft_ds3.yaml 

为了启动 DeepSpeed 引擎,配置文件中 deepspeed 参数指定了 DeepSpeed 配置文件的路径:

 deepspeed: examples/deepspeed/ds_z3_config.json 
  • 使用deepspeed指令启动DeepSpeed引擎

您也可以使用 deepspeed 指令启动 DeepSpeed 引擎进行单机多卡训练。

deepspeed --include localhost:1 your_program.py <normal cl args> --deepspeed ds_config.json 

下面是一个例子:

deepspeed --num_gpus 8 src/train.py \ --deepspeed examples/deepspeed/ds_z3_config.json \ --stage sft \ --model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \ --do_train \ --dataset alpaca_en \ --template llama3 \ --finetuning_type full \ --output_dir saves/llama3-8b/lora/full \ --overwrite_cache \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 500 \ --learning_rate 1e-4 \ --num_train_epochs 2.0 \ --plot_loss \ --bf16 

使用 deepspeed 指令启动 DeepSpeed 引擎时无法使用 CUDA_VISIBLE_DEVICES 指定GPU。而需要:

deepspeed --include localhost:1 your_program.py <normal cl args> --deepspeed ds_config.json 

include localhost:1 表示只是用本节点的gpu1。

3.2 多机多卡

  • 使用llamafactory-cli启动DeepSpeed训练

LLaMA-Factory 支持使用 DeepSpeed 的多机多卡训练,您可以通过以下命令启动:

FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=0 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 llamafactory-cli train examples/train_lora/llama3_lora_sft_ds3.yaml FORCE_TORCHRUN=1 NNODES=2 NODE_RANK=1 MASTER_ADDR=192.168.0.1 MASTER_PORT=29500 llamafactory-cli train examples/train_lora/llama3_lora_sft_ds3.yaml 
  • 使用deepspeed指令启动DeepSpeed训练

您也可以使用 deepspeed 指令来启动多机多卡训练。

deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \ your_program.py <normal cl args> --deepspeed ds_config.json 

hostfile的每一行指定一个节点,每行的格式为 slots=<num_slots> , 其中 是节点的主机名, <num_slots> 是该节点上的GPU数量。下面是一个例子: … code-block:worker-1 slots=4 worker-2 slots=4
如果没有指定 hostfile 变量, DeepSpeed 会搜索 /job/hostfile 文件。如果仍未找到,那么 DeepSpeed 会使用本机上所有可用的GPU。

  • 使用accelerate指令启动DeepSpeed训练

您还可以使用 accelerate 指令启动 DeepSpeed 引擎。 首先通过以下命令生成 DeepSpeed 配置文件:

accelerate config 

下面提供一个配置文件示例:

#deepspeed_config.yaml compute_environment: LOCAL_MACHINE debug: false deepspeed_config: deepspeed_multinode_launcher: standard gradient_accumulation_steps: 8 offload_optimizer_device: none offload_param_device: none zero3_init_flag: false zero_stage: 3 distributed_type: DEEPSPEED downcast_bf16: 'no' enable_cpu_affinity: false machine_rank: 0 main_process_ip: '192.168.0.1' main_process_port: 29500 main_training_function: main mixed_precision: fp16 num_machines: 2 num_processes: 16 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false 

随后,可以使用以下命令启动训练:

accelerate launch \ --config_file deepspeed_config.yaml \ train.py llm_config.yaml 
  • DeepSpeed 配置文件

ZeRO-0

#ds_z0_config.json{"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","gradient_accumulation_steps": "auto","gradient_clipping": "auto","zero_allow_untested_optimizer": true,"fp16": {"enabled": "auto","loss_scale": 0,"loss_scale_window": 1000,"initial_scale_power": 16,"hysteresis": 2,"min_loss_scale": 1 },"bf16": {"enabled": "auto"},"zero_optimization": {"stage": 0,"allgather_partitions": true,"allgather_bucket_size": 5e8,"overlap_comm": true,"reduce_scatter": true,"reduce_bucket_size": 5e8,"contiguous_gradients": true,"round_robin_gradients": true }}

ZeRO-2
只需在 ZeRO-0 的基础上修改 zero_optimization 中的 stage 参数即可。

#ds_z2_config.json{..."zero_optimization": {"stage": 2,...}}

ZeRO-2+offload
只需在 ZeRO-0 的基础上在 zero_optimization 中添加 offload_optimizer 参数即可。

#ds_z2_offload_config.json{..."zero_optimization": {"stage": 2,"offload_optimizer": {"device": "cpu","pin_memory": true },...}}

ZeRO-3
只需在 ZeRO-0 的基础上修改 zero_optimization 中的参数。

#ds_z3_config.json{..."zero_optimization": {"stage": 3,"overlap_comm": true,"contiguous_gradients": true,"sub_group_size": 1e9,"reduce_bucket_size": "auto","stage3_prefetch_bucket_size": "auto","stage3_param_persistence_threshold": "auto","stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": true }}

ZeRO-3+offload
只需在 ZeRO-3 的基础上添加 zero_optimization 中的 offload_optimizer 和 offload_param 参数即可。

ds_z3_offload_config.json {..."zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true },"offload_param": {"device": "cpu","pin_memory": true },...}}

3.3 小结

实操:
1 实操基于DeepSpeed的单机多卡训练
2 实操基于DeepSpeed的多机多卡训练

4.FSDP

PyTorch 的全切片数据并行技术 FSDP(Fully Sharded Data Parallel)能让我们处理更多更大的模型。LLaMA-Factory支持使用 FSDP 引擎进行分布式训练。
FSDP 的参数 ShardingStrategy 的不同取值决定了模型的划分方式:

  • FULL_SHARD: 将模型参数、梯度和优化器状态都切分到不同的GPU上,类似ZeRO-3。
  • SHARD_GRAD_OP: 将梯度、优化器状态切分到不同的GPU上,每个GPU仍各自保留一份完整的模型参数。类似ZeRO-2。
  • NO_SHARD: 不切分任何参数。类似ZeRO-0。

4.1 llamafactory-cli

您只需根据需要修改 examples/accelerate/fsdp_config.yaml 以及 examples/extras/fsdp_qlora/llama3_lora_sft.yaml ,文件然后运行以下命令即可启动 FSDP+QLoRA 微调:

bash examples/extras/fsdp_qlora/train.sh 

4.2 accelerate

此外,您也可以使用 accelerate 启动 FSDP 引擎, 节点数与 GPU 数可以通过 num_machines 和 num_processes 指定。对此,Huggingface 提供了便捷的配置功能。 只需运行:

accelerate config 

根据提示回答一系列问题后,我们就可以生成 FSDP 所需的配置文件。
当然您也可以根据需求自行配置 fsdp_config.yaml 。

#/examples/accelerate/fsdp_config.yaml compute_environment: LOCAL_MACHINE debug: false distributed_type: FSDP downcast_bf16: 'no' fsdp_config: fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_backward_prefetch: BACKWARD_PRE fsdp_forward_prefetch: false fsdp_cpu_ram_efficient_loading: true fsdp_offload_params: true # offload may affect training speed fsdp_sharding_strategy: FULL_SHARD fsdp_state_dict_type: FULL_STATE_DICT fsdp_sync_module_states: true fsdp_use_orig_params: true machine_rank: 0 main_training_function: main mixed_precision: fp16 # or bf16 num_machines: 1 # the number of nodes num_processes: 2 # the number of GPUs in all nodes rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false 

请确保 num_processes 和实际使用的总GPU数量一致
随后,您可以使用以下命令启动训练:

accelerate launch \ --config_file fsdp_config.yaml \ src/train.py llm_config.yaml 

4.3 小结

实操:
1 实操基于DPP的单机多卡训练
2 实操基于DPP的多机多卡训练
3 实操基于DeepSpeed的单机多卡训练
4 实操基于DeepSpeed的多机多卡训练
5 实操基于FSDP的单机多卡训练
6 实操基于FSDP的多机多卡训练

Read more

【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!! **🔥个人主页:IF’Maxue-ZEEKLOG博客 🎬作者简介:C++研发方向学习者 📖**个人专栏: 《C语言》 《C++深度学习》 《Linux》 《数据结构》 《数学建模》** ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行! 文章目录 * 一、先搞懂:我们要解决啥问题? * 二、核心计算:代码怎么判断“烟幕有没有用”? * 1. 先算单个烟幕的“有效时间段” * 2. 合并重叠的时间段(避免重复计算) * 3. 只算“导弹到达前”的有效时间 * 三、代码优化:加了2个实用功能,结果直接看 * 1. 跑完直接显示“最优遮蔽时长”

Moon VR Video Player中文版下载地址及使用教程:支持8K/12K+多音轨外挂字幕 Moon VR Video Player中文版、Moon VR播放器下载、VR视频播放器推荐、Ste

Moon VR Video Player中文版下载地址及使用教程:支持8K/12K+多音轨外挂字幕 Moon VR Video Player中文版、Moon VR播放器下载、VR视频播放器推荐、Ste

Moon VR Video Player中文版下载地址及使用教程:支持8K/12K+多音轨外挂字幕 关键词:Moon VR Video Player中文版、Moon VR播放器下载、VR视频播放器推荐、SteamVR播放器、多音轨外挂字幕播放器、8K 12K VR播放 作为一个长期折腾的开发者,这段时间一直在找一款真正稳定、格式兼容性强、支持多音轨和外挂字幕的VR播放器。市面上不少播放器要么格式支持有限,要么在8K以上直接卡顿,更别说复杂场景下的字幕和音轨切换。 这次测试的是 Moon VR Video Player(月亮播放器)v835 + 2.8.18 中文版,整体体验确实比很多常见播放器更完整。下面做一次系统梳理,方便需要的朋友参考。 下载地址 链接:https://pan.quark.cn/s/7c80590579cf 一、

3DMAX VR渲染器局部渲染设置教程

3DMAX VR渲染器局部渲染设置教程

VR 渲染器局部渲染设置 VR 渲染器的局部渲染功能灵活适配多种场景(尤其全景图),操作步骤如下: 1. 调出渲染设置面板:在 3DMAX 软件中,直接按下快捷键「F10」,快速打开渲染设置窗口(也可通过顶部菜单栏「渲染」→「渲染设置」手动调出)。 2. 确认渲染器类型:在渲染设置面板中,切换到「指定渲染器」选项卡,确保当前选定的渲染器为「V-Ray 渲染器」(若未选中,点击下拉菜单切换即可)。 1. 打开 VR 帧缓冲器:切换到「V-Ray」选项卡,找到「帧缓冲器」设置项,勾选「启用内置帧缓冲器」(部分版本默认开启),点击右侧「显示 VFB」按钮,调出 VR 帧缓冲窗口。 1.