前言随着大模型参数量从 7B、13B 攀升至几十 B、上百 B传统 PyTorch DDP 数据并行存在致命缺陷每张 GPU 都会完整复制一份模型、梯度、优化器参数显存冗余极高小显存显卡极易 OOM 显存溢出。微软开源的 DeepSpeed 凭借ZeRO 内存分片优化将训练状态分散到多卡 GPU 甚至 CPU 内存大幅降低单卡显存占用让个人多卡服务器也能训练超大模型。本文结合线下多卡训练实测经验从底层原理、安装部署、ZeRO Stage1/2/3 完整配置、性能实测对比、高频报错排查全方位梳理 DeepSpeed 落地要点理清「显存占用」与「训练速度」的核心取舍逻辑帮开发者快速选对适合自己硬件的训练方案。LLaMA-Factory 支持通过 DDP、DeepSpeed 和 FSDP 三种引擎实现单机多卡及多机多卡训练能有效突破显存瓶颈并大幅提升训练效率 。LLaMA-Factory 提供可视化 WebUILLaMA Board无需编写复杂命令图形化即可开启、配置 DeepSpeed 分布式训练解决单卡显存不足、多卡并行加速需求。 适用场景7B/13B/20B 大模型 LoRA 微调、单机多卡训练、显存紧张场景使用 ZeRO 分片优化。LLaMA-Factory中做如下配置就可完成多卡训练一、DeepSpeed 核心底层思想CPU 内存补充 GPU 显存DeepSpeed 核心逻辑一句话概括GPU 显存不够CPU 内存来兜底。 传统并行方案每张卡留存全套训练参数而 ZeRO 会把优化器、梯度、模型权重分片分散存储训练计算时按需在 GPU、CPU 之间传输交换。显存占用越低CPU/GPU 数据交互越频繁训练速度损耗越大这是使用 DeepSpeed 永远绕不开的权衡关系。官方原生支持两大核心能力ZeRO-offload 卸载将优化器、模型参数临时缓存至主机内存释放 GPU 空间支持更大批次、更大模型加载内存碎片自动管理减少张量碎片化浪费同等显存下支持更长上下文、更大 batch_size。适用场景单 / 多卡显存不足以承载完整模型需要低成本训练大模型仅单卡且显存充足、模型参数量较小时不推荐使用会徒增训练耗时。二、DeepSpeed 两种安装方式方式 1极简 pip 一键安装新手推荐pip install deepspeed方式 2源码编译安装适配本机 CUDA 架构性能更好针对 RTX 30/40 系列算力 8.6编译命令git clone https://github.com/microsoft/DeepSpeed.git cd DeepSpeed rm -rf build TORCH_CUDA_ARCH_LIST8.6 DS_BUILD_CPU_ADAM1 DS_BUILD_UTILS1 pip install . \ --global-optionbuild_ext --global-option-j8 --no-cache -v \ --disable-pip-version-check 21 | tee build.log配套 HuggingFace 集成安装Transformers 原生兼容 DeepSpeed可直接安装集成包训练时无需额外适配代码pip install transformers[deepspeed]三、ZeRO 分片技术核心原理分片替代复制传统 DDP所有 GPU 复制全套优化器状态梯度模型参数显存成倍冗余。 ZeROZero Redundancy Optimizer分片存储而非完整复制把三类训练状态拆分至多设备消除显存冗余分三个渐进优化阶段表格ZeRO 阶段分片对象显存降低幅度速度损耗适用硬件Stage1仅优化器状态分片小幅降低几乎无损耗8×24G 充足多卡、追求速度优先Stage2优化器 梯度同时分片中等降低轻微损耗4×24G 均衡多卡工程最常用Stage3优化器 梯度 模型权重全分片大幅降低损耗极大单 / 双卡小显存、13B/20B 超大模型关键补充ZeRO-InfinityStage3 进阶在 Stage3 基础上支持把参数卸载到 NVMe 固态硬盘进一步压榨内存空间适合上百 B 超大规模模型普通 7B/13B 微调无需启用。四、ZeRO 各阶段完整可复用配置文件所有配置中重复训练参数学习率调度、混合精度统一设为auto会自动读取 Hugging Face Trainer、LLaMA Factory 训练参数避免参数冲突。4.1 ZeRO Stage2 通用配置生产首选均衡方案兼顾显存释放与训练速度绝大多数单机多卡微调优先选用json{ bfloat16: { enabled: auto }, fp16: { enabled: auto, loss_scale: 0, loss_scale_window: 1000, initial_scale_power: 16, hysteresis: 2, min_loss_scale: 1 }, optimizer: { type: AdamW, params: { lr: auto, betas: auto, eps: auto, weight_decay: auto } }, scheduler: { type: WarmupLR, params: { warmup_min_lr: auto, warmup_max_lr: auto, warmup_num_steps: auto } }, zero_optimization: { stage: 2, offload_optimizer: { device: cpu, pin_memory: true }, allgather_partitions: true, allgather_bucket_size: 2e8, overlap_comm: true, reduce_scatter: true, reduce_bucket_size: 2e8, contiguous_gradients: true }, gradient_accumulation_steps: auto, gradient_clipping: auto, train_batch_size: auto, train_micro_batch_size_per_gpu: auto, steps_per_print: 100000 }核心参数说明offload_optimizer.device: cpu优化器存放至内存释放显存pin_memory开启页锁定内存加速 CPU/GPU 数据传输overlap_comm通信与计算并行数值越大通信越快、显存占用越高按需平衡reduce_bucket_size梯度聚合分片大小自动适配模型尺寸无需手动修改。4.2 ZeRO Stage3 超大显存节约配置模型过大、单卡无法加载完整权重时使用速度会明显下降{ bfloat16: { enabled: auto }, fp16: { enabled: auto, loss_scale: 0, loss_scale_window: 1000, initial_scale_power: 16, hysteresis: 2, min_loss_scale: 1 }, optimizer: { type: AdamW, params: { lr: auto, betas: auto, eps: auto, weight_decay: auto } }, scheduler: { type: WarmupLR, params: { warmup_min_lr: auto, warmup_max_lr: auto, warmup_num_steps: auto } }, zero_optimization: { stage: 3, offload_optimizer: { device: cpu, pin_memory: true }, offload_param: { device: cpu, pin_memory: true }, 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_fp16_weights_on_model_save: true }, gradient_accumulation_steps: auto, gradient_clipping: auto, train_batch_size: auto, train_micro_batch_size_per_gpu: auto, steps_per_print: 100000, wall_clock_breakdown: false }新增offload_param将模型权重也卸载至内存显存占用达到最低代价是大量数据交换训练速度大幅降低。4.3 启动训练命令模板# 指定GPU数量、端口、ds配置文件 deepspeed --master_port 29500 --num_gpus4 train.py \ --deepspeed ds_zero2_config.json--master_port分布式通信端口多任务并行需修改避免占用--num_gpus使用显卡数量不填默认调用全部 GPU。五、显存占用预估工具训练前提前避坑DeepSpeed 提供内置预估函数提前计算 ZeRO-3 模式下 CPU、内存占用避免内存不足进程被杀from transformers import AutoModel from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live # 替换你的基座模型 model AutoModel.from_pretrained(Qwen2.5-7B-Instruct) # 单节点4卡预估 estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node4, num_nodes1)使用原则能不用 ZeRO 就不用显存充足优先 Stage2万不得已再选用 Stage3。六、线下实测Stage2 / Stage3 性能对比测试环境单卡 RTX4090 24G7B 模型 LoRA 微调batch_size2ZeRO Stage2 实测数据原始显存占用20513MiB → 开启后 17349MiB释放约 3GB 显存训练速度1.3 iter/s → 0.77 iter/s速度下降约 40%痛点释放显存有限不足以提升 batch_size总训练时长变长。ZeRO Stage3 实测数据显存占用可降低 50% 以上但速度损耗极其严重原本 6 小时训练任务开启后耗时超 48 小时日常微调不推荐使用。七、DeepSpeed 常见踩坑与完整解决方案1. 进程无报错直接被系统杀死原因offload 后大量参数存入系统内存物理内存不足系统 OOM Killer 终止进程。 解决先用预估脚本计算内存需求free -h查看空闲内存减少 offload 范围优先只卸载优化器关闭offload_param增加机器物理内存或更换多机分布式训练。2. 训练 loss 持续变为 NaN原因混合精度缩放值不合适、学习率过高、梯度爆炸。 解决配置开启gradient_clipping: 1.0梯度裁剪降低学习率微调推荐 5e-05 及以下FP16 模式调大initial_scale_power优先使用 BF16 训练。3. ZeRO offload 模式无法自定义分层学习率DeepSpeed 内置 AdamW 优化器会接管参数更新逻辑自定义优化器必须同时实现 CPU、GPU 两套版本开发成本极高。 解决LoRA 微调无需分层学习可直接使用内置优化器需要自定义时放弃 offload改用纯 GPU ZeRO Stage1。4. VS Code 无法断点调试 DeepSpeed 进程DeepSpeed 分布式进程通信机制不兼容 VS Code 调试插件官方无适配方案。 解决调试阶段关闭 DeepSpeed单卡原生 Trainer 验证逻辑正式训练再启用 ZeRO。5. 训练控制台无输出、GPU 满载看不到进度多卡分片通信会屏蔽部分日志输出仅 GPU 利用率无法判断训练状态。 解决调小steps_per_print每几十步打印一次 loss监控训练进度。八、DeepSpeed 推理补充说明超大模型推理同样可复用 ZeRO Stage3 配置推理阶段会自动忽略 optimizer、学习率等训练参数仅使用分片加载逻辑适合单卡低显存机器运行大模型推理。进阶 ZeRO-Infinity 支持 SSD 分担内存适合超大规模离线推理场景。九、落地选型总结实操建议硬件充足4/8×24G、追求训练速度选用 ZeRO Stage2仅卸载优化器速度损耗可控显存紧张、单 / 双卡跑 13B/20B 模型临时使用 ZeRO Stage3项目长期不推荐LoRA 轻量化微调优先 Stage2大部分场景足够释放显存硬件富余、单卡完全装下模型直接原生 DDP不启用 DeepSpeed避免速度损耗内存资源有限时严禁同时开启offload_optimizer与offload_param极易触发系统杀进程。一、前置准备1. 安装 DeepSpeed 依赖pip install deepspeed2. 准备 DeepSpeed 配置文件 ds_config.json项目examples/deepspeed/目录内置官方模板ds_z0_config.jsonZeRO-0不做分片仅多卡数据并行ds_z2_config.jsonZeRO-2优化器 梯度分片均衡速度 / 显存4 卡 24G 首选ds_z3_config.jsonZeRO-3权重全分片显存占用最低适合单 / 双卡跑超大模型LLaMA Fact...通用 ZeRO-2 配置生产推荐{ bfloat16: {enabled: auto}, fp16: {enabled: auto}, optimizer: { type: AdamW, params: { lr: auto, betas: auto, eps: auto, weight_decay: auto } }, scheduler: {type: WarmupLR, params: {warmup_min_lr: auto, warmup_max_lr: auto, warmup_num_steps: auto}}, zero_optimization: { stage: 2, offload_optimizer: {device: cpu, pin_memory: true}, allgather_partitions: true, allgather_bucket_size: 2e8, overlap_comm: true, reduce_scatter: true, reduce_bucket_size: 2e8, contiguous_gradients: true }, gradient_accumulation_steps: auto, gradient_clipping: auto, train_batch_size: auto, train_micro_batch_size_per_gpu: auto, steps_per_print: 100 }二、启动 LLaMA-Factory WebUI1. 指定可用显卡多卡必须配置# 限定使用0、1、2、3四张显卡 export CUDA_VISIBLE_DEVICES0,1,2,3 # 启动可视化微调面板 llamafactory-cli webui访问地址http://localhost:7860三、WebUI 界面开启 DeepSpeed 分步操作步骤 1进入「训练」标签页基础参数配置模型设置model_name_or_path本地基座模型完整路径finetuning_typeLoRA轻量化微调template匹配基座模型对话模板qwen/llama3 等数据集设置dataset_dir数据集根目录datasetdataset_info.json注册的数据集名称训练超参per_device_train_batch_size、learning_rate、num_train_epochs按需填写步骤 2找到高级设置「DeepSpeed」选项核心页面下方高级加速 / 分布式区域存在deepspeed下拉输入框两种配置方式方式 A选择内置 ds 模板最简单新手推荐下拉菜单内置预设配置ds_z0、ds_z2、ds_z3、ds_z2_offload等直接选中即可自动加载对应 json 配置文件无需手动填写路径CSDN博...。方式 B手动填写自定义配置文件绝对路径若修改过自定义ds_config.json直接填入文件完整路径示例/home/xxx/LLaMA-Factory/examples/deepspeed/ds_z2_config.json步骤 3确认精度与混合精度WebUI 中bf16勾选开启与 DeepSpeed 配置内bfloat16.enabledauto保持兼容避免 loss 出现 NaN。步骤 4点击「开始训练」自动启用多卡 DeepSpeedWebUI 底层自动封装FORCE_TORCHRUN1分布式启动指令无需手动写 bash 脚本自动根据显卡数量执行多卡训练LLaMA Fact...。四、ZeRO 阶段选型界面配置建议表格硬件环境WebUI 选择 DeepSpeed 模板适用场景8×24G 充足多卡ds_z0 / ds_z2追求训练速度优先4×24G 均衡多卡ds_z2推荐显存释放与速度平衡日常 LoRA 微调首选单 / 双卡 24G跑 13B/20B 大模型ds_z3最大限度节省显存代价是训练速度变慢五、常见界面报错与解决1. 报错找不到 deepspeed 配置文件原因填写的文件路径错误、文件名拼写错误使用内置模板但文件缺失解决复制配置文件绝对路径使用官方内置模板不要自定义文件名2. 多卡训练显存负载不均衡原因ZeRO stage 选择错误通信桶参数不匹配解决4 卡优先选择 ds_z2不推荐直接使用 ds_z3 日常微调3. 训练 loss 出现 NaN原因混合精度冲突、学习率过高解决WebUI 勾选 bf16降低学习率至 5e-5 以内开启梯度裁剪4. 进程被系统 OOM 杀死原因ZeRO-3 开启 cpu 卸载占用大量系统内存解决改用 ZeRO-2关闭offload_param仅保留优化器卸载六、命令行 YAML 配套参考WebUI 导出配置WebUI 训练完成后可导出 yaml 训练配置DeepSpeed 核心片段stage: sft do_train: true model_name_or_path: /root/model/Qwen2.5-7B-Instruct finetuning_type: lora template: qwen dataset: my_train_data cutoff_len: 1024 per_device_train_batch_size: 4 learning_rate: 5e-5 num_train_epochs: 10 # DeepSpeed 核心配置 trainer: type: deepspeed deepspeed: examples/deepspeed/ds_z2_config.json如需离线命令行训练直接执行FORCE_TORCHRUN1 llamafactory-cli train train_config.yaml七、落地最佳实践优先使用 WebUI 内置 ds_z2 模板适配绝大多数多卡微调场景超大模型13B/20B、单卡显存不足时再选用 ds_z3启动 WebUI 前务必通过CUDA_VISIBLE_DEVICES限定显卡防止占用全部 GPU训练前小规模样本测试流程确认 DeepSpeed 正常启动、无显存溢出再全量训练。