资讯动态

PAISoar深度学习训练加速:混合精度与分布式实战指南

发布时间:2026/10/15 9:30:37 来源:尧图企业网站定制
深度学习训练慢这件事几乎每个跑过CNN的人都有一肚子苦水。一个ResNet-50在单卡上跑ImageNet动辄两三天才能收敛中间调个参、改个网络结构重新训练的时间成本直接让人崩溃。最近PAISoar这个方案在圈子里被反复提起号称能把训练速度拉高两个数量级也就是一百倍。这个数字听起来很夸张但拆开看它的技术路径其实是有据可循的。我花了些时间把它的核心思路、实现细节和落地要点梳理了一遍结合自己在分布式训练上踩过的坑写成这篇东西给正在被训练速度折磨的朋友一个参考。不管你是刚配好PyTorch GPU环境的新手还是已经在多机多卡上折腾过的老手应该都能从中找到能直接用的东西。1. 为什么深度学习训练需要一百倍加速1.1 训练慢到底慢在哪里先说清楚问题才知道加速方案在解决什么。深度学习训练的时间开销本质上由三块构成前向传播、反向传播、参数更新。对于CNN这类模型前向和反向的计算量都集中在卷积层上一个典型的卷积层做一次前向计算量是特征图尺寸乘以卷积核尺寸再乘以输入输出通道数。以VGG-16为例单张224x224的图片过一次前向浮点运算量大约在155亿次这个量级反向传播差不多是前向的两倍。也就是说一张图一个完整训练步接近500亿次浮点运算。单张GPU的算力是有限的。一块主流训练卡FP32算力大概在十几到几十TFLOPS之间理论上跑VGG-16一个batch假设batch size为64需要的时间可以算出来但实际跑起来远达不到理论峰值。原因在于GPU的计算单元经常在等数据等的是从内存搬过来的权重和特征图。这就是所谓的访存瓶颈。算力再强数据喂不上来计算单元就空转。除了单卡的计算和访存瓶颈还有几个隐藏的时间黑洞。数据加载和预处理经常成为瓶颈尤其是做数据增强的时候CPU解码图片、做随机裁剪翻转的速度跟不上GPU消费的速度GPU就在那里干等。梯度同步在多卡场景下也是大头每张卡算完梯度要和其他卡做all-reduce通信时间随卡数增加而增长。还有checkpoint保存、日志写入这些看似不起眼的操作在大规模训练里累积起来也很可观。1.2 一百倍这个数字是怎么算出来的一百倍不是凭空喊的它通常是多个维度优化效果的乘积。单卡层面通过混合精度训练可以把FP32换成FP16理论算力翻倍甚至更多因为很多GPU的FP16吞吐是FP32的两倍。再加上算子融合、显存优化单卡效率提升两三倍是常见的。分布式层面数据并行把batch分散到多张卡上理想情况下N张卡带来接近N倍的吞吐。但通信开销会吃掉一部分实际加速比通常在0.7到0.9之间。如果用上更高效的通信策略和梯度压缩这个比例还能往上提。再叠加流水线并行、张量并行这些模型并行技术把大模型切开放到不同设备上又能突破单卡显存限制让更大的batch和更大的模型跑起来。把这些乘在一起从单卡FP32的基线到一个高度优化的分布式FP16训练系统两个数量级的提升是能摸到的。PAISoar的价值就在于它把这套复杂的优化组合封装成了相对易用的方案而不是让每个团队从零去搭。注意一百倍是特定基线下的对比结果通常是对比未优化的单卡FP32训练。如果你的基线已经是调优过的多卡混合精度训练再想提升一百倍是不现实的这时候能再提升两三倍就已经很可观了。2. PAISoar 的核心设计思路拆解2.1 它到底是个什么东西PAISoar不是一个单一的算法而是一套面向深度学习训练的加速系统。它的定位介于底层框架和上层应用之间向下对接PyTorch、TensorFlow这类训练框架向上提供一套配置化的加速能力。你可以把它理解成一个训练加速中间件把混合精度、分布式通信、显存管理、数据流水线这些优化点打包在一起通过配置文件或者少量代码改动就能启用。这种设计的好处是侵入性低。你不需要重写模型定义也不需要手动管理每张卡上的梯度同步只需要在启动脚本里加上PAISoar的入口或者在训练代码里引入它的封装层。对于已经有成熟训练代码的团队来说迁移成本是可控的。这也是它比从零自研分布式训练系统更实际的地方。从技术栈上看PAISoar依赖几个关键组件NCCL做GPU间通信CUDA做底层算子可能还会用到cuDNN做卷积加速。它做的事情是在这些底层能力之上做调度和编排让它们协同工作而不是各自为战。2.2 混合精度为什么是加速的第一杠杆混合精度训练是PAISoar加速体系里最基础也最有效的一环。核心思想很简单前向和反向计算用FP16因为FP16的算力吞吐更高、显存占用更小但权重更新和梯度累加用FP32保证数值稳定性。为什么FP16能快两个原因。第一GPU的FP16计算单元吞吐通常是FP32的两倍同样的计算量用FP16跑理论上时间减半。第二FP16的显存占用是FP32的一半这意味着同样显存能放更大的batch或者放更大的模型。batch变大之后GPU的利用率会提升因为计算单元更不容易空转。但FP16有个致命问题数值范围窄。FP16能表示的最小正数大约是6e-8最大约65504。梯度在反向传播中可能变得非常小小到FP16直接下溢成零训练就崩了。PAISoar用的解决方案是损失缩放loss scaling。具体做法是在计算loss的时候乘上一个大的缩放因子比如1024这样梯度也被放大了同样倍数不会下溢。更新权重之前再把梯度除回来。这个缩放因子可以是固定的也可以是动态调整的动态调整更稳PAISoar默认走的是动态策略。实际操作中混合精度不是简单把模型转成half就完事。有些算子对精度敏感比如softmax、layer norm、loss计算这些必须保持FP32。PAISoar内部维护了一个算子精度白名单自动决定哪些算子用FP16、哪些用FP32。你自己写自定义算子的时候要注意如果发现训练不稳定先检查是不是某个自定义算子被错误地用了FP16。2.3 分布式策略的选择逻辑PAISoar支持数据并行和模型并行两种模式实际用哪种取决于你的模型大小和硬件条件。数据并行是最常用的。每张卡上放一份完整的模型副本把batch切成N份每张卡算自己那份的梯度然后所有卡做all-reduce把梯度平均。这种方式实现简单适合模型能单卡放下的场景。它的瓶颈在通信卡越多all-reduce的数据量越大。PAISoar在数据并行上做了梯度分桶和通信重叠就是把梯度分成若干桶一个桶在通信的时候另一个桶在计算把通信时间藏到计算时间后面。模型并行适合单卡放不下的大模型。把模型的不同层放到不同卡上数据在卡之间流水线式传递。这种方式通信量相对小但实现复杂而且容易出现负载不均衡有的卡算得快有的卡算得慢快的等慢的。PAISoar提供了自动切分策略根据每层的计算量和参数量来决定怎么切尽量减少流水线气泡。混合并行是把两者结合在节点内用张量并行把单层切开节点间用数据并行。这是目前训练超大模型的主流做法。PAISoar支持这种组合但配置起来更复杂需要对模型结构和集群拓扑都有清晰的认识。并行方式适用场景通信开销实现难度数据并行模型单卡可放下中高随卡数增长低模型并行单卡放不下的大模型中流水线气泡高混合并行超大模型大规模集群高需精细调优很高2.4 数据流水线为什么不能忽视很多人优化训练速度只盯着GPU忽略了数据加载。实际上在图像训练里数据预处理经常是隐藏的瓶颈。一张JPEG图片解码成RGB数组再做随机裁剪、翻转、归一化这一套下来CPU开销不小。如果DataLoader的worker数量不够或者预处理逻辑写得太重GPU就会周期性空转等数据。PAISoar在数据流水线这块做了几件事。一是预取在当前batch还在GPU上计算的时候CPU已经在准备下一个batch的数据了。二是把部分预处理放到GPU上做比如归一化和简单的几何变换GPU做这些比CPU快得多。三是支持数据格式优化比如把图片预先转成更高效的二进制格式避免每次训练都重新解码JPEG。这里有个经验如果你的GPU利用率曲线是锯齿状的忽高忽低大概率是数据加载的问题。用nvidia-smi看GPU利用率如果经常掉到50%以下再冲上去就该检查DataLoader了。把num_workers调大开pin_memory往往能立刻看到改善。3. 核心细节解析与实操要点3.1 环境准备与依赖安装PAISoar的运行依赖比较明确。基础环境需要CUDA和cuDNN版本要和你的GPU驱动匹配。NCCL是必须的做多卡通信。Python侧需要PyTorch版本建议不要太老新版本对混合精度和分布式支持更好。安装流程大致是这样。先确认驱动和CUDA版本用nvidia-smi看驱动支持的CUDA最高版本然后装对应版本的CUDA Toolkit。cuDNN要注册下载解压后把库文件放到CUDA目录下。NCCL如果是多卡训练必须装单卡可以跳过。然后装PyTorch去官网选对应CUDA版本的安装命令。最后装PAISoar本身通常是通过包管理器或者从源码编译。# 检查GPU和驱动 nvidia-smi # 确认CUDA版本 nvcc --version # 安装PyTorch以CUDA 11.8为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装PAISoar pip install paisoar注意CUDA版本、PyTorch版本、PAISoar版本三者必须匹配。我见过太多因为版本不匹配导致的诡异报错比如能跑起来但速度没提升或者多卡通信直接hang住。装之前先查兼容性矩阵别凭感觉装。环境变量也要配好。CUDA_VISIBLE_DEVICES控制用哪些卡NCCL相关的环境变量影响通信效率。比如NCCL_IB_DISABLE控制是否禁用InfiniBand如果你的集群没有IB网络要设成1否则NCCL会尝试用IB然后超时。3.2 混合精度训练的关键参数启用混合精度训练PAISoar提供了封装好的接口。核心是amp自动混合精度模块autocast上下文管理器负责在前向传播时自动把算子转成FP16GradScaler负责损失缩放和梯度更新。import torch from paisoar import amp model MyCNN().cuda() optimizer torch.optim.SGD(model.parameters(), lr0.01) scaler amp.GradScaler() for data, target in dataloader: optimizer.zero_grad() with amp.autocast(): output model(data) loss criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()这段代码里几个点值得说。autocast的上下文范围要包住前向传播和loss计算但不要包住backwardbackward由scaler处理。scaler.scale把loss放大backward的时候梯度也被放大。scaler.step在更新前检查梯度有没有出现inf或nan如果有就跳过这一步并降低缩放因子。scaler.update调整缩放因子如果连续多步没有溢出就增大有溢出就减小。初始缩放因子默认是65536这个值对大多数模型够用。如果你的模型特别容易溢出可以调小到4096或者1024。反过来如果训练很稳定但速度没提升可能是缩放因子太小导致频繁触发梯度检查可以适当调大。还有一个容易忽略的点有些操作在autocast下会自动转FP16但你可能希望它保持FP32。比如计算loss的时候如果loss本身很小FP16下可能精度不够。这时候可以用amp.autocast(enabledFalse)局部禁用或者用torch.cuda.amp.custom_fwd/custom_bwd装饰器指定某个函数的精度。3.3 分布式训练的启动与配置PAISoar的分布式训练启动方式有两种单机多卡和多机多卡。单机多卡用torchrun或者PAISoar自己的launcher多机多卡需要配置节点间的通信。单机多卡的启动命令大概是这样# 单机8卡训练 paisoar launch --nproc_per_node8 train.py \ --batch_size256 \ --use_amp \ --dist_backendnccl多机多卡需要指定主节点地址和端口以及每个节点的rank# 节点0主节点 paisoar launch --nproc_per_node8 --nnodes2 --node_rank0 \ --master_addr192.168.1.100 --master_port29500 train.py # 节点1 paisoar launch --nproc_per_node8 --nnodes2 --node_rank1 \ --master_addr192.168.1.100 --master_port29500 train.py配置里有几个参数直接影响性能。batch_size是全局batch会被平均分到每张卡上。如果全局batch是256、8张卡每张卡实际处理32。这里要注意学习率要跟着batch调整线性缩放规则是batch翻倍学习率也翻倍但这不是绝对的大batch有时候需要warmup。dist_backend选nccl这是GPU间通信最快的后端。gloo是CPU用的别选错。如果集群有InfiniBand网络NCCL会自动用IB速度比以太网快一个数量级。没有IB的话至少保证节点间是万兆网千兆网做分布式训练通信会成为严重瓶颈。3.4 梯度累积与batch size的权衡显存不够放不下大batch的时候梯度累积是个实用的技巧。原理是不每个batch都更新权重而是累积几个batch的梯度再更新一次。这样等效于放大了batch size但显存占用不变。accumulation_steps 4 for i, (data, target) in enumerate(dataloader): with amp.autocast(): output model(data) loss criterion(output, target) / accumulation_steps scaler.scale(loss).backward() if (i 1) % accumulation_steps 0: scaler.step(optimizer) scaler.update() optimizer.zero_grad()注意loss要除以累积步数这样梯度的量级才和真实大batch一致。还有optimizer.zero_grad()的位置要在更新之后清不能在每个batch都清。梯度累积和混合精度配合的时候有个细节scaler.step和scaler.update只在真正更新权重的那一步调用中间累积的步骤只做backward。如果搞错了缩放因子会被频繁调整训练可能不稳定。提示梯度累积虽然省显存但会增加训练步数总时间不一定减少。它的价值在于让你能用更大的等效batch从而可能用更高的学习率、获得更稳的收敛。如果单纯为了省显存不如考虑梯度检查点gradient checkpointing用计算换显存。4. 实操过程与核心环节实现4.1 从单卡到多卡的完整迁移流程假设你有一个单卡训练脚本想迁移到PAISoar的多卡加速。步骤是这样的。第一步把模型包装成分布式版本。PAISoar提供了DistributedDataParallel的封装比PyTorch原生的DDP多了些优化比如梯度分桶和通信重叠。import torch.distributed as dist from paisoar import DistributedDataParallel as DDP dist.init_process_group(backendnccl) local_rank int(os.environ[LOCAL_RANK]) torch.cuda.set_device(local_rank) model MyCNN().cuda() model DDP(model, device_ids[local_rank])第二步DataLoader要加DistributedSampler保证每张卡拿到不同的数据子集不会重复训练。from torch.utils.data.distributed import DistributedSampler sampler DistributedSampler(dataset, num_replicasworld_size, rankrank) dataloader DataLoader(dataset, batch_sizeper_gpu_batch, samplersampler)第三步只在主进程做日志和checkpoint保存避免多张卡同时写文件冲突。if rank 0: torch.save(model.state_dict(), checkpoint.pth) print(fEpoch {epoch}, loss {loss.item()})第四步调整学习率和batch size。全局batch变成per_gpu_batch乘以卡数学习率按线性规则调整但通常要加warmup前几个epoch让学习率从很小的值慢慢升上去避免一开始梯度太大导致发散。这套流程走下来8卡训练相比单卡理想情况吞吐提升接近8倍。实际因为通信开销可能在6到7倍之间。如果提升不到5倍就要检查通信是不是瓶颈了。4.2 通信优化的几个实操手段通信是分布式训练的主要开销来源。PAISoar在通信上做了几层优化理解这些优化有助于你调参。梯度分桶是最基础的。默认情况下每个参数的梯度单独做all-reduce小梯度的通信延迟占比高。分桶是把多个小梯度拼成一个大buffer再通信减少通信次数。桶的大小可以配太小了通信次数多太大了内存占用高。经验值是25MB左右一个桶PAISoar默认会动态调整。通信重叠是更高级的优化。反向传播是从后往前算梯度的后面的层先算完梯度可以先开始通信同时前面的层还在计算。这样通信和计算并行总时间缩短。PAISoar通过把梯度分桶并按反向传播顺序排列实现了这种重叠。梯度压缩是另一个方向。把FP32梯度压缩成FP16甚至INT8再通信通信量减少但会引入精度损失。PAISoar支持梯度压缩但默认不开因为对某些模型可能影响收敛。如果你的模型对精度不敏感可以试试通信量减半速度提升明显。优化手段通信量变化精度影响适用场景梯度分桶不变无所有分布式训练通信重叠不变无所有分布式训练FP16梯度压缩减半轻微大模型、通信瓶颈明显INT8梯度压缩减至1/4中等对精度不敏感的场景4.3 显存优化的实战技巧显存不够是训练大模型时的常见问题。除了混合精度能省一半显存还有几个手段。激活检查点activation checkpointing是拿计算换显存。正常前向传播会把每层的激活值存下来供反向传播用这很占显存。激活检查点只存部分层的激活反向传播时重新计算没存的那些。显存能省很多但计算量增加约30%。PAISoar支持按层配置对显存占用大的层开启检查点小的层不开。梯度累积前面说过了省显存但增加步数。还有ZeRO优化把优化器状态、梯度、参数分片到不同卡上每张卡只存一部分。ZeRO-1只分片优化器状态ZeRO-2再分片梯度ZeRO-3连参数也分片。分片越彻底显存越省但通信量越大。PAISoar集成了ZeRO配置里选stage就行。实际调的时候先用混合精度不够再开激活检查点还不够上ZeRO。ZeRO-3最省显存但通信开销大如果集群网络好可以用网络差的话可能得不偿失。4.4 性能监控与瓶颈定位优化不能瞎调得先知道瓶颈在哪。PAISoar提供了性能分析工具能输出每个算子的耗时、通信占比、GPU利用率。最基础的监控是nvidia-smi看GPU利用率和显存占用。利用率长期低于80%说明有瓶颈要么是数据加载慢要么是通信等待。显存占用接近上限说明batch不能再大了。更细的分析用PyTorch Profiler或者PAISoar自带的profiler。它能告诉你时间花在哪些算子上是卷积慢还是全连接慢是前向慢还是反向慢。如果发现某个算子异常慢可能是实现有问题或者精度设置不对。通信分析看NCCL的日志。设置NCCL_DEBUGINFO能看到每次all-reduce的耗时和数据量。如果通信时间占比超过30%说明通信是瓶颈要考虑梯度压缩或者换更快的网络。# 开启NCCL调试日志 export NCCL_DEBUGINFO export NCCL_DEBUG_SUBSYSALL # 运行训练观察通信耗时 paisoar launch --nproc_per_node8 train.py提示性能分析本身有开销profiler开启后训练会变慢。建议只在排查问题时开定位到瓶颈后就关掉。另外profiler的输出文件可能很大注意磁盘空间。5. 常见问题与排查技巧实录5.1 训练不收敛或loss变nan混合精度训练最常见的问题就是loss变nan。原因通常是梯度溢出FP16放不下。排查步骤是这样。先看scaler的缩放因子。如果缩放因子一直在下降说明频繁溢出。可以手动把初始缩放因子调小比如从65536降到4096。如果调小后还是溢出说明模型本身有问题不是精度的事。然后检查哪些算子用了FP16。有些算子对精度敏感比如计算方差、做归一化这些必须FP32。PAISoar的autocast有默认的白名单但自定义算子可能没被正确识别。用amp.autocast(enabledFalse)把可疑的部分包起来看是否解决。还有可能是学习率太大。混合精度下梯度的量级和FP32不完全一样原来的学习率可能偏大。试试把学习率减半或者加warmup。如果以上都试了还不行退回FP32训练确认模型本身能收敛。如果FP32也nan那就是模型或数据的问题和混合精度无关。5.2 多卡训练速度不升反降多卡比单卡还慢这听起来离谱但确实会发生。原因通常是通信开销超过了并行收益。先检查网络。节点间是千兆网的话通信会成为严重瓶颈。8卡跨节点训练梯度同步的数据量可能达到几百MB千兆网传一次要好几秒计算才几百毫秒通信占了大头。这种情况要么换万兆网或InfiniBand要么减少跨节点通信比如节点内用张量并行、节点间用数据并行。再检查batch size。如果每张卡的batch太小比如只有8计算量不足以掩盖通信延迟。增大per-gpu batch或者用梯度累积增加等效batch。还要检查是不是所有卡都在工作。有时候某张卡因为显存不足或者数据问题卡住了其他卡在等它。用nvidia-smi看每张卡的利用率如果有的卡利用率明显低就是负载不均衡。5.3 显存溢出OOM的应急处理OOM是训练大模型的家常便饭。应急处理有几个方向。立刻能做的减小batch size这是最直接的。开混合精度显存直接减半。开激活检查点显存再降一截。稍微麻烦点的用ZeRO分片把优化器状态和梯度分散到多卡。清理不必要的缓存torch.cuda.empty_cache()能释放一些碎片显存。检查有没有张量没释放比如在循环里累积了loss但没有detach。长期的优化模型结构减少参数量。用更高效的算子比如深度可分离卷积替代普通卷积。或者上模型并行把模型切开放到不同卡上。问题现象可能原因排查手段解决方案loss变nan梯度溢出看scaler缩放因子调小初始缩放因子多卡变慢通信瓶颈NCCL日志看通信耗时换网络或梯度压缩OOM显存不足nvidia-smi看占用减batch或开ZeROGPU利用率低数据加载慢看DataLoader耗时加worker或预取训练卡住某卡异常逐卡看利用率检查数据和显存5.4 数据加载成为瓶颈的识别与解决数据加载瓶颈的典型表现是GPU利用率周期性下降。用nvidia-smi -l 1每秒刷新如果利用率在30%到90%之间反复横跳基本可以确定是数据问题。解决思路是让CPU准备数据的速度跟上GPU消费的速度。增加DataLoader的num_workers一般设成CPU核心数。开pin_memory把数据放到锁页内存传到GPU更快。用prefetch_factor控制预取多少个batch。如果预处理逻辑太重考虑把部分操作移到GPU上。比如归一化CPU做要遍历所有像素GPU一个kernel就搞定。还有图片解码如果数据集是JPEG每次训练都解码很浪费可以预先转成numpy数组或者LMDB格式训练时直接读。注意num_workers不是越大越好。设太大反而会因为进程切换开销导致变慢。一般从4开始试逐步加到8、16看哪个值GPU利用率最高。另外Windows上num_workers大于0可能有问题Linux上没这个限制。6. 不同规模场景下的配置建议6.1 单机单卡的个人开发者个人开发者通常只有一张卡显存有限预算也有限。这种场景下混合精度是性价比最高的优化几乎无成本就能提速接近一倍。开AMP把batch size调到显存允许的最大值GPU利用率能上去。数据加载用num_workers4到8pin_memoryTrue。如果数据集不大可以整个加载到内存里避免每次读磁盘。模型方面用预训练权重做迁移学习比从头训练快得多收敛也快。这种场景不需要分布式PAISoar的分布式功能用不上但它的混合精度和显存优化模块是独立的可以单独用。6.2 单机多卡的小团队小团队一般有一台8卡服务器。这种场景下数据并行是首选。用PAISoar的DDP封装8卡跑起来吞吐提升6到7倍。注意学习率要按全局batch调整加warmup。通信在单机内走NVLink或者PCIe速度比跨节点快得多通信开销占比小。这时候瓶颈往往在数据加载8张卡同时消费数据CPU压力大。num_workers要相应增加或者用更高效的数据格式。显存方面8卡加起来显存总量大了可以跑更大的模型。如果单卡放不下可以试试ZeRO-2把优化器状态和梯度分片每张卡显存占用降低。6.3 多机多卡的大规模训练多机多卡是真正考验工程能力的地方。网络是核心InfiniBand比以太网快一个数量级有条件一定要上。没有IB的话至少万兆网千兆网做大规模训练基本不可行。并行策略要仔细设计。节点内用张量并行或流水线并行节点间用数据并行。通信要分层节点内走NVLink节点间走IB。PAISoar支持这种分层通信配置但需要根据集群拓扑调。容错也很重要。大规模训练跑几天难免有节点出问题。PAISoar支持checkpoint自动保存和恢复出问题后从最近的checkpoint继续不用从头来。checkpoint的频率要权衡太频繁影响训练速度太稀疏出问题后损失大。一般每几个epoch存一次。学习率方面超大batch需要更精细的调参。线性缩放规则在batch特别大的时候会失效需要用平方根缩放或者LARS、LAMB这类自适应优化器。PAISoar集成了这些优化器配置里选就行。7. 我踩过的坑和几条实在建议混合精度不是万能的。我遇到过模型开了AMP之后收敛变慢的情况排查发现是某个自定义的归一化层在FP16下数值不稳定。解决办法是把这个层强制用FP32其他层保持FP16。所以开AMP之后一定要对比收敛曲线不能只看速度。分布式训练的调试成本很高。单卡能跑通的代码多卡不一定能跑通。建议先在单卡上把逻辑调对再迁移到多卡。迁移的时候先跑通2卡再上8卡逐步增加出问题容易定位。通信优化要基于实际测量。不要凭感觉觉得通信是瓶颈就去加梯度压缩先用profiler测一下通信占比。如果通信只占10%压缩到5%也就提升5%但精度可能受损不划算。显存优化是有代价的。激活检查点省显存但增加计算ZeRO-3省显存但增加通信。用之前想清楚瓶颈到底是显存还是速度别为了省显存把速度搭进去。最后加速的收益要放在整个训练周期里看。如果数据加载和预处理占了总时间的一半光优化GPU计算只能提升剩下的那一半。先找到真正的瓶颈再针对性优化比盲目堆技术有效得多。PAISoar这类工具的价值在于它把常用的优化都准备好了你只需要按需开启但前提是你知道自己需要什么。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑