96SEO 2026-02-20 00:08 2
}
上周在生产环境遇到了这个问题,排查了2天才定位到原因。
今天分享一下完整的解决方案,希望帮大家避坑。
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: class="toc">d="M5,0
rgba(0,
PyTorch实战(26)——PyTorch分布式训练
分布式训练
前言
在将预训练的机器学习模型投入生产环境之前,模型训练是不可或缺的关键环节。
随着深度学习的发展,大模型往往具有数百万乃至数十亿参数。
使用反向传播来调整这些参数需要大量的内存和计算资源。
即便如此,模型训练仍然可能需要数天甚至数月时间才能完成。
在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。
我们将系统学习
PyTorchAPI——torch.distributed、torch.multiprocessing
torch.utils.data.distributed.DistributedSampler,使用这些
API通过本节学习,将能够充分释放硬件设备的训练潜力。
对于超大规模模型训练而言,本节所探讨的工具不仅至关重要,在某些情况下甚至是不可或缺的。
进行分布式训练
在本节中,我们将模型训练过程从常规训练转换为分布式训练,探讨
PyTorch提供的分布式训练工具,这些工具能显著提升训练速度并优化硬件使用效率。
以常规方式训练模型
(1)
punctuation">.functional
punctuation">.
utilspunctuation">.
devicepunctuation">)
class-name">ConvNet punctuation">. punctuation">( punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. operator">= punctuation">. punctuation">. punctuation">. punctuation">. punctuation">( punctuation">. punctuation">. punctuation">)class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
PyTorch(ConvNet),并定义了优化器。
punctuation">.epochs
class="token
punctuation">(
train_dataloaderclass="token
punctuation">(
deviceclass="token
punctuation">(
deviceclass="token
punctuation">.
nll_lossclass="token
punctuation">(
pred_probclass="token
punctuation">.
zero_gradclass="token
punctuation">.
backwardclass="token
punctuation">(
train_dataloaderclass="token
punctuation">(
train_dataloaderclass="token
punctuation">)
epoch数。
在循环内,通过批数据的方式遍历整个训练数据集,本节中批大小为
128个训练数据点的批次,使用模型进行前向传播,以计算预测概率。
然后,我们将预测结果结合真实标签计算批次损失,并通过反向传播利用该损失梯度来调整模型参数。
punctuation">.ArgumentParser punctuation">. punctuation">. punctuation">} punctuation">)class="token
class="token
class="token
class="token
Python数。
我们还对训练过程进行了计时,以便可以将它与分布式训练过程进行比较。
main()punctuation">)
Pythonepoch,因为当前重点不在于模型精度,而在于模型训练耗时。
可以看到输出结果如下所示:
src="https://i-blog.csdnimg.cn/direct/ef6dc7ca957d45e6931be750a12882bb.png#pic_center">
训练
1API,即使存在跨进程或跨机器重复传递数据的额外开销,模型训练速度也能显著提升。
punctuation">.functional
punctuation">.
utilsclass="token
punctuation">.
multiprocessing
punctuation">.
distributed
torch.multiprocessing用于在单台机器上生成多个
核心数生成对应数量的进程),而torch.distributed则实现不同机器间的通信协作,使它们能共同完成模型训练。
执行时,我们需要在每台参与训练的机器上显式启动训练脚本。
PyTorch
Gloo)会自动处理机器间的通信协调。
在每台机器内部,多进程机制会进一步将训练任务并行分配到各个进程。
模型架构定义部分保持不变:
class-name">ConvNet
class="token
punctuation">.
Moduleclass="token
punctuation">(
ConvNetclass="token
punctuation">.
__init__class="token
punctuation">.
Conv2dclass="token
punctuation">.
Conv2dclass="token
punctuation">.
Dropout2dclass="token
punctuation">.
Dropout2dclass="token
punctuation">.
Linearclass="token
punctuation">.
Linearclass="token
punctuation">.
max_pool2dclass="token
punctuation">.
flattenclass="token
punctuation">.
log_softmaxclass="token
punctuation">(
cpu_numclass="token
punctuation">.
machine_id
punctuation">.
num_processes
punctuation">.
init_process_groupclass="token
punctuation">.
world_sizeclass="token
punctuation">.
manual_seedclass="token
punctuation">.
deviceclass="token
punctuation">)
rank值——这本质上是该进程在整个分布式系统中的顺序标识符。
举例来说,若使用
2class="katex-mathml">rank=n×4+krank=n\times
0.0315em">k
init_process_group,该方法为每个启动的进程配置以下关键参数:
Gloo)
world_size
rank值
init_process_group
方法会阻塞所有进程,直到跨机器的全部进程都完成初始化才会继续执行。
PyTorch
GlooNCCLMPI简而言之,对于
CPUpunctuation">.MNIST operator">= punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. operator">= punctuation">. operator">= punctuation">. punctuation">( punctuation">. punctuation">. punctuation">. punctuation">( punctuation">. punctuation">)class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
与单机训练相比,分布式训练的关键改进体现在数据加载与模型封装两个层面。
我们将
MNISTDistributedSampler
shuffleFalse,因为数据分配已由采样器控制。
nn.parallel.DistributedDataParallel
DistributedDataParallel
DistributedDataParallel
Python进程运行在独立的解释器上,有效规避了在单一解释器下多线程实例化多个模型可能引发的全局解释器锁
Global限制问题。
这进一步提升了性能表现,特别是对于那些需要大量Python专属运算的模型而言。
punctuation">.epochs
class="token
punctuation">(
train_dataloaderclass="token
punctuation">(
deviceclass="token
punctuation">(
deviceclass="token
punctuation">.
nll_lossclass="token
punctuation">(
pred_probclass="token
punctuation">.
zero_gradclass="token
punctuation">.
backwardclass="token
punctuation">(
train_dataloaderclass="token
punctuation">(
train_dataloaderclass="token
punctuation">)
最后,训练循环几乎和单机训练一样。
唯一的区别在于我们限制只有排名为0的进程才能获取日志信息。
这是因为排名为
0的进程作为参考来跟踪模型训练性能。
如果不加以限制,每个模型训练迭代都会产生与进程数量相同的日志行数。
punctuation">.ArgumentParser punctuation">. string">'--num-machines' punctuation">. string">'--num-processes' punctuation">. string">'--machine-id' punctuation">. punctuation">. string">'--batch-size' punctuation">. punctuation">.class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">.
num_processespunctuation">.
num_machinespunctuation">.
environstring">'MASTER_ADDR'
punctuation">.
environstring">'MASTER_PORT'
punctuation">.
spawnpunctuation">(
trainpunctuation">.
num_processespunctuation">}
punctuation">)
num_machines:机器总数量num_processes:每台机器上要启动的进程数量machine_id:当前机器的序号Python脚本需要在每台机器上单独启动
batch_size:每个批次的数据样数量。参数作用如下:
个独立的数据集
因此,在每次迭代时,完整的批次数据需要被分割成
相关联,所以我们将其作为输入参数提供,目的是为了简化训练接口。
MASTER_ADDR:运行rank地址
MASTER_PORT:运行rank进程的主机上可用的端口号
rank
机器负责建立所有后端通信连接,因此整个系统必须能随时定位到该主机,这就是为什么需要提供其
IP个进程,而非仅运行单个训练进程。
分布式参数会传递给每个派生进程,确保模型训练过程中各进程与机器之间能自主协调。
优化建议:
如果你的项目访问量较大,建议增加缓存机制。
我们团队在优化后,接口响应时间从800ms降到了50ms,
效果非常明显。
具体的缓存策略可以根据业务场景调整。
punctuation">)
启动分布式训练脚本。
首先使用分布式脚本进行类非分布式运行,将机器数量和进程数量都设置为
1:number">128
需要注意的是,由于本次训练只使用单个进程,batch_size
src="https://i-blog.csdnimg.cn/direct/0399a43aea07439d8419bdfe703f3b26.png#pic_center">
若将此结果与上一节非分布式训练的输出对比,可发现训练时间基本相当(约
30src="https://i-blog.csdnimg.cn/direct/ddabcb373c3a44b8a4d71cea0c4b6175.png#pic_center">
可以看到,训练时间从
30秒。
训练损失的变化趋势没有受到影响,这表明分布式训练可以加速训练过程,同时保持模型的准确性。
src="https://i-blog.csdnimg.cn/direct/55914888f36d4ffea3c686c87f8f2235.png#pic_center">
可以看到,训练时间进一步减少,从
20秒。
训练损失的变化趋势仍然与之前的训练相似。
通过分布式训练,我们已经将训练时间从
30src="https://i-blog.csdnimg.cn/direct/142ec629bded486bb476584b72cb687e.png#pic_center">
与预期相反,训练时间不仅没有进一步缩短,反而从
15秒。
由于代码在本地机器执行,系统还存在其他进程(如浏览器)会与部分分布式训练进程争夺资源。
如果分布式训练模型是在远程机器上进行的,同时这些机器的唯一任务就是进行模型训练,在这样的机器上,建议使用与
CPU最后需要指出的是,由于在本节中我们只使用了一台机器,因此我们只需要启动一个
Python脚本来开始训练。
然而,如果是在多台机器上进行训练,那么除了修改
上实施分布式训练深度学习模型的实践探讨,这种方法能带来显著的加速效果。
仅需添加少量代码,就能将常规
PyTorch模型训练脚本升级为分布式训练模式。
虽然上述实验基于简单的卷积网络,但由于我们完全无需修改模型架构代码,因此这套方案可直接扩展到更复杂的模型训练场景。
接下来,我们将简要讨论如何应用类似的代码更改,实现
GPUpunctuation">.device punctuation">. punctuation">)class="token
class="token
CUDA通过并行化处理神经网络常规运算(如矩阵乘法和加法)所能提供的显著加速优势。
本节我们将探讨如何通过
GPUpunctuation">(gpu_num punctuation">.class="token
punctuation">.
num_gpu_processespunctuation">.
init_process_grouppunctuation">.
world_sizepunctuation">.
set_devicepunctuation">(
gpu_numpunctuation">(
gpu_numpunctuation">.
NLLLosspunctuation">(
gpu_numpunctuation">)
在使用
punctuation">.MNIST operator">= punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. punctuation">. operator">= punctuation">. operator">= punctuation">. punctuation">( punctuation">. punctuation">. punctuation">. punctuation">( punctuation">[ punctuation">. punctuation">)class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
DistributedDataParallel
包含一个关键参数——device_ids,用于指定调用该
APITrue,该参数能显著加速训练过程中从主机(此处指加载数据集的
CPU的数据传输。
pin_memory
pin)内存中,即把数据样本分配到固定的页锁定内存区域。
训练时,这些内存区域的数据会被高效地拷贝到对应
punctuation">.epochs punctuation">( punctuation">( punctuation">( punctuation">( punctuation">. punctuation">. punctuation">( punctuation">( punctuation">)class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
non_blocking,使得以下两者之间的操作得以重叠:
数据(真实标签)的传输
GPUpunctuation">.ArgumentParser punctuation">. string">'--num-machines' punctuation">. string">'--num-gpu-processes' punctuation">. string">'--machine-id' punctuation">. punctuation">. string">'--batch-size' punctuation">. punctuation">.class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">.
num_gpu_processespunctuation">.
num_machinespunctuation">.
environstring">'MASTER_ADDR'
punctuation">.
environstring">'MASTER_PORT'
punctuation">.
spawnpunctuation">(
trainpunctuation">.
num_gpu_processespunctuation">}
punctuation">)
用
torch.cuda.device_count()
GPUnumber">128
至此,我们已完成关于使用
分布式模型训练的简要探讨。
上述代码同样适用于其他深度学习模型,当前深度学习模型大多采用
GPU分布式训练方案。
此外,Horovod、DeepSpeed
PyTorchid="_417">小结
在本节中,我们探讨了机器学习中一个重要的实践方面——如何优化模型训练过程,介绍了使用
PyTorchhref="https://blog.csdn.net/LOVEmy134611/article/details/149906996"
nofollow">PyTorch实战(1)——深度学习(Deep
Learning)
PyTorch实战(2)——使用PyTorch构建神经网络
PyTorch实战(3)——PyTorch
TensorFlow详解
PyTorch实战(4)——卷积神经网络(Convolutional
Network,CNN)
PyTorch实战(5)——深度卷积神经网络
PyTorch实战(6)——模型微调详解
PyTorch实战(7)——循环神经网络
PyTorch实战(8)——图像描述生成
PyTorch实战(9)——从零开始实现Transformer
PyTorch实战(10)——从零开始实现GPT模型
PyTorch实战(11)——随机连接神经网络(RandWireNN)
PyTorch实战(12)——图神经网络(Graph
Network,GNN)
PyTorch实战(13)——图卷积网络(Graph
Network,GCN)
PyTorch实战(14)——图注意力网络(Graph
Network,GAT)
PyTorch实战(15)——基于Transformer的文本生成技术
PyTorch实战(16)——基于LSTM实现音乐生成
PyTorch实战(17)——神经风格迁移
PyTorch实战(18)——自编码器(Autoencoder,AE)
PyTorch实战(19)——变分自编码器(Variational
Autoencoder,VAE)
PyTorch实战(20)——生成对抗网络(Generative
Network,GAN)
PyTorch实战(21)——扩散模型(Diffusion
Model)
PyTorch实战(22)——MuseGAN详解与实现
PyTorch实战(23)——基于Transformer生成音乐
PyTorch实战(24)——深度强化学习
PyTorch实战(25)——使用PyTorch构建DQN模型
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback