LLama factory 多卡 ZeRO-3 、ZeRO-2、 ZeRO-0什么意思?以及为什么没有ZeRO1

在这里插入图片描述
https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/deepspeed/ds_z3_config.json

结论:做大模型的无脑冲ZeRo-3就完事了

在 LLaMA Factory 或其他大模型训练环境中,ZeRO(Zero Redundancy Optimizer)是一种分布式训练优化技术,主要用于高效地利用多卡资源来训练大模型。它有三个主要阶段,分别是 ZeRO-0ZeRO-2ZeRO-3,代表不同的优化程度和资源分布策略。

以下是详细解释:


1. ZeRO-0(Optimizer State Partitioning)

  • 功能:将优化器状态(如梯度、动量、二阶动量等)按 GPU 划分,每张 GPU 只存储一部分优化器状态。
  • 特性
    • 每个 GPU 存储自己的模型参数副本(模型参数未分布)。
    • 优化器状态被分布到多 GPU 上,减少单张 GPU 的显存占用。
    • 显存占用优化:中等。

适用场景
当模型规模适中,但优化器状态较大,且显存压力主要来自优化器时。


2. ZeRO-2(Gradient Partitioning + ZeRO-0)

  • 功能:在 ZeRO-0 的基础上,进一步将**梯度(gradients)**分布到多张 GPU 上。
  • 特性
    • 优化器状态和梯度都被分布存储,减少单张 GPU 的显存需求。
    • 每张 GPU 仍然保存完整的模型参数。
    • 显存占用优化:显著减少。

适用场景
适合较大规模的模型,尤其是梯度计算对显存占用较高时。


3. ZeRO-3(Parameter Partitioning + ZeRO-2)

  • 功能:在 ZeRO-2 的基础上,进一步将**模型参数(model parameters)**本身分布到多 GPU 上。
  • 特性
    • 优化器状态、梯度和模型参数都分布到多 GPU 上,显存需求最小化。
    • 没有一张 GPU 需要完整存储模型参数。
    • 显存占用优化:极大减少,可支持超大规模模型。
    • 通信开销增加:由于参数需要在多个 GPU 间动态传输,通信成本较高。

适用场景
适合超大规模模型训练(如 GPT-3、LLaMA),显存需求超过单卡或单节点的情况。


对比总结

特性 ZeRO-0 ZeRO-2 ZeRO-3
优化器状态分布
梯度分布
模型参数分布
显存优化程度 中等 极高
通信开销 中等
适合模型规模 中等 超大

如何选择 ZeRO 优化级别

  1. 显存充足:选择 ZeRO-0 或 ZeRO-2,减少通信开销。
  2. 显存不足,模型超大:选择 ZeRO-3。
  3. 动态需求:可以从 ZeRO-0 开始逐步尝试更高级别。

此外,使用 ZeRO 时通常需要结合分布式训练框架(如 DeepSpeed 或 HuggingFace Trainer),确保工具链支持。


为什么没有zero1

没有 ZeRO-1 是因为 ZeRO 分布式优化技术的命名直接跳过了这个阶段。其设计目标是解决训练大规模深度学习模型时的显存瓶颈,阶段的划分主要是基于显存优化的渐进策略,而 ZeRO-1 的需求被包含在 ZeRO-2 中。以下是更详细的解释:


1. ZeRO 的阶段划分逻辑

ZeRO 的各阶段是为了逐步减少显存占用,优化逻辑是基于显存的三个主要组成部分:

  1. 优化器状态(Optimizer States)
    如动量(momentum)、二阶动量(second moment),它们在计算梯度更新时被用到。

  2. 梯度(Gradients)
    模型反向传播时计算的梯度信息。

  3. 模型参数(Model Parameters)
    模型的权重和偏置值。

各阶段的作用

  • ZeRO-0:只优化了优化器状态的分布。
  • ZeRO-2:进一步优化了梯度的分布。
  • ZeRO-3:将模型参数也分布到多 GPU。

由于 ZeRO-2 包含了 ZeRO-1 的功能(梯度优化),没有必要单独定义 ZeRO-1。


2. ZeRO-1 的潜在定义

如果一定要将 ZeRO 分得更细,可以人为地假设:

  • ZeRO-1:仅分布梯度,不分布优化器状态和模型参数。
  • 这种方式可能会带来一些显存优化,但不如 ZeRO-2 高效。

然而,DeepSpeed 的开发团队选择直接跳过了这个中间阶段,认为 ZeRO-1 的作用被 ZeRO-2 完全覆盖,从而更简洁地定义了优化策略。


3. 为什么直接跳过?

  • 避免混淆:直接定义从 ZeRO-0 到 ZeRO-2 和 ZeRO-3 的优化进阶,减少分布式训练策略的复杂性。
  • 覆盖需求:实际中,梯度优化的场景通常会伴随优化器状态的优化(即 ZeRO-2)。
  • 研发效率:开发人员可能认为实现和推广 ZeRO-2
一、目的1. 加速训练过程2. 适应大规模数据3. 资源利用率高4. 提升训练速度5. 增大系统容量6. 提高系统可用性7. 加速模型迭代二、 LLaMA-Factory1.安装2. LLaMA-Factory 校验三、 训练引擎1.DDP2. DeepSpeed3.FSDP四、WebUI五. 参数配置1. 模型2. 数据3. 训练参数4. 参数1. ZeRO-12. ZeRO-23. ZeRO-3六、训练七、推理八、XTuner一、目的分布式训练是一种在个计算节点上共同完成机器学习模型训练任务的过程,它可以充分利用台计算机的资源,提高训练效率和模型准确性。分布式训练的主要优势包括:1. 加速训练过程通过并行计算,分布式训练大幅缩短了训练时间,提高了训练效率。提高模型准确性:利用更的计算资源和数据样本进行训练,减少了过拟合风险,提高了模型的泛化能力和准确性。2. 适应大规模数据分布式训练能够处理传统单机训练难以应对的大规模数据集。3. 资源利用率高有效利用了计算资源,避免了单机训练时的资源闲置和浪费。4. 提升训练速度通过并行计算,分布式训练能够显著缩短模型训练的时间,尤其是在处理大规模数据集和复杂模型时效果更为明显。5. 增大系统容量随着业务量的增长,单机性能已无法满足需求。分布式训练通过台计算设备的协同工作,能够应对更大规模的应用场景。6. 提高系统可用性分布式架构能够消除单点故障,提高系统的整体可用性。即使某个计算设备出现故障,也不会影响整个训练任务的进行。7. 加速模型迭代在快速迭代的机器学习项目中,分布式训练能够更快地完成模型训练,从而加速模型迭代和优化过程。总的来说,分布式训练在深度学习领域提高训练效率和加快模型收敛的重要手段 。二、 LLaMA-Factory1.安装在安装 LLaMA-Factory 之前,请确保您安装了下列依赖:运行以下指令以安装 LLaMA-Factory 及其依赖:git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"123如果出现环境冲突,请尝试使用 pip install --no-deps -e . 解决2. LLaMA-Factory 校验完成安装后,可以通过使用 llamafactory-cli version 来快速校验安装是否成功如果看到类似下面的界面,就说明安装成功了。 Successfully uninstalled requests-2.31.0 Attempting uninstall: anyio Found existing installation: anyio 4.4.0 Uninstalling anyio-4.4.0: Successfully uninstalled anyio-4.4.0Successfully installed accelerate-1.2.1 aiofiles-23.2.1 aiohappyeyeballs-2.4.6 aiohttp-3.11.12 aiosignal-1.3.2 annotated-types-0.7.0 anyio-4.8.0 audioread-3.0.1 av-14.1.0 click-8.1.8 datasets-3.2.0 dill-0.3.8 docstring-parser-0.16 einops-0.8.1 fastapi-0.115.8 ffmpy-0.5.0 fire-0.7.0 frozenlist-1.5.0 gradio-5.12.0 gradio-client-1.5.4 huggingface-hub-0.28.1 jieba-0.42.1 joblib-1.4.2 lazy-loader-0.4 librosa-0.10.2.post1 llamafactory-0.9.2.dev0 llvmlite-0.44.0 markdown-it-py-3.0.0 mdurl-0.1.2 msgpack-1.1.0 multidict-6.1.0 multiprocess-0.70.16 nltk-3.9.1 numba-0.61.0 orjson-3.10.15 pandas-2.2.3 peft-0.12.0 pooch-1.8.2 propcache-0.2.1 pyarrow-19.0.0 pydantic-2.10.6 pydantic-core-2.27.2 pydub-0.25.1 python-multipart-0.0.20 pytz-2025.1 regex-2024.11.6 requests-2.32.3 rich-13.9.4 rouge-chinese-1.0.3 ruff-0.9.6 safehttpx-0.1.6 safetensors-0.5.2 scikit-learn-1.6.1 scipy-1.15.1 semantic-version-2.10.0 sentencepiece-0.2.0 shellingham-1.5.4 shtab-1.7.1 soundfile-0.13.1 soxr-0.5.0.post1 sse-starlette-2.2.1 starlette-0.45.3 termcolor-2.5.0 threadpoolctl-3.5.0 tiktoken-0.9.0 tokenizers-0.21.0 tomlkit-0.13.2 tqdm-4.67.1 transformers-4.48.3 trl-0.9.6 typer-0.15.1 typing-extensions-4.12.2 tyro-0.8.14 tzdata-2025.1 uvicorn-0.34.0 websockets-14.2 xxhash-3.5.0 yarl-1.18.3WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venvroot@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/LLaMA-Factory# llamafactory-cli version----------------------------------------------------------| Welcome to LLaMA Factory, version 0.9.2.dev0 || || Project page: https://github.com/hiyouga/LLaMA-Factory |----------------------------------------------------------root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/LLaMA-Factory# 1234567891011121314三、 训练引擎LLaMA-Factory 支持单机分布式训练。同时也支持 DDP , DeepSpeed 和 FSDP 三种分布式引擎。1.DDPDDP (DistributedDataParallel) 通过实现模型并行和数据并行实现训练加速。 使用 DDP 的程序需要生成个进程并且为每个进程创建一个 DDP 实例,他们之间通过 torch.distributed 库同步。2. DeepSpeedDeepSpeed 是微软开发的分布式训练引擎,并提供ZeROZero Redundancy Optimizer)、offload、Sparse Attention、1 bit Adam、流水线并行等优化技术。 您可以根据任务需求与设备选择使用。3.FSDP通过全切片数据并行技术(Fully Sharded Data Parallel)来处理更更大的模型。在 DDP 中,每张 GPU 都各自保留了一份完整的模型参数和优化器参数。而 FSDP 切分了模型参数、梯度与优化器参数,使得每张 GPU 只保留这些参数的一部分。 除了并行技术之外,FSDP 还支持将模型参数卸载至CPU,从而进一步降低显存需求。由于deepseek分布式训练加速,采用混合精度(fp16/fp32)和ZeRO优化,减少显存占用,从而加速训练。所以本文采用DeepSpeed 是训练引擎。四、WebUILLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 在完成 安装 后,您可以通过以下指令进入 WebUI:llamafactory-cli webui1WebUI 主要分为四个界面:训练、评估与预测、对话、导出。当运行上面命令后,打开如下界面在开始训练模型之前,需要指定的参数有:模型名称及路径训练阶段微调方法训练数据集学习率、训练轮数等训练参数微调参数等其他参数输出目录及配置路径
最新发布
03-20
### LLaMA-Factory 分布式训练引擎概述 LLaMA-Factory 是一个用于大语言模型微调的开源工具包,支持种分布式训练引擎,包括 DDP (Distributed Data Parallel),DeepSpeed 和 FSDP (Fully Sharded Data Parallel)[^1]。这些引擎能够显著提升大规模模型训练效率。 #### 安装与环境准备 为了使用 LLaMA-Factory 及其分布式训练功能,需先完成 Python 虚拟环境搭建和依赖库安装。推荐使用 `conda` 或 `virtualenv` 创建独立环境,并运行以下命令: ```bash git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -r requirements.txt ``` 对于 GPU 集群的支持,确保已正确安装 CUDA 和 PyTorch 版本兼容驱动程序[^4]。 --- #### 校验流程 在正式开始训练前,建议验证硬件资源分配及通信状态正常。可以通过如下脚本测试集群连通性和性能指标: ```python import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP def test_distributed_setup(): rank = int(os.environ["RANK"]) world_size = int(os.environ["WORLD_SIZE"]) dist.init_process_group(backend="nccl", init_method="env://") model = YourModel().to(rank) ddp_model = DDP(model, device_ids=[rank]) input_data = torch.randn((batch_size, feature_dim)).to(rank) output = ddp_model(input_data) test_distributed_setup() ``` 上述代码片段展示了如何初始化 NCCL 后端并创建基于 DDP 的模型实例[^2]。 --- #### 分布式训练引擎详解及其参数配置 ##### 1. **DDP** DDP 实现了数据并行机制,适合中小型规模模型训练场景。主要参数包括: - `find_unused_parameters`: 是否检测未使用的张量,默认关闭。 - `gradient_as_bucket_view`: 提升梯度计算内存利用率。 启动方式示例: ```bash torchrun --nproc_per_node=8 train.py \ --distributed-backend nccl \ --ddp-find-unused-params True ``` ##### 2. **DeepSpeed** DeepSpeed 提供更高级别的优化选项,特别是针对超大规模稀疏化需求的应用案例。它集成了 ZeRO 系列算法(ZeRO-Offload、ZeRO-Degree),可有效降低显存占用率。 典型配置文件 (`ds_config.json`) 如下所示: ```json { "fp16": { "enabled": true, "loss_scale": 0, "initial_scale_power": 32 }, "optimizer": { "type": "Adam", "params": { "lr": 0.0001, "betas": [0.9, 0.999], "eps": 1e-8, "weight_decay": 3e-7 } }, "zero_optimization": { "stage": 3, "offload_optimizer": {"device": "cpu"}, "overlap_comm": true } } ``` 加载 DeepSpeed 并执行训练过程的方法为: ```python from deepspeed import DeepSpeedConfig config_path = "./ds_config.json" model_engine, optimizer, _, _ = deepspeed.initialize( args=args, model=model, config=config_path ) for epoch in range(num_epochs): for batch in dataloader: loss = model_engine(batch) model_engine.backward(loss) model_engine.step() ``` ##### 3. **FSDP** 相比传统 DDP 方法,FSDP 更加注重完全分片策略下的高效性实现[^1]。以下是关键设置项: - `sharding_strategy`: 控制具体分片模式,例如 FULL_SHARD 表明整个网络会被均匀分割到各节点上。 - `mixed_precision_policy`: 自定义精度控制逻辑以平衡速度与质量之间的关系。 实际应用例子: ```python fsdp_model = FullyShardedDataParallel( module=model, sharding_strategy=FSDP.ShardingStrategy.FULL_SHARD, mixed_precision=MixedPrecision(param_dtype=torch.float16), cpu_offload=True ) ``` --- #### WebUI 微调支持 部分版本可能附带图形界面操作入口简化调试体验,不过官方文档并未特别强调此特性。如果需要定制化 UI 功能,则考虑引入第三方框架扩展能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值