卷积神经网络的分布式训练(三)分布式训练实战(pytorch框架)

该专题是我本科毕设的各个知识点介绍和分析,以及一些实验结果展示。本科毕业了,研究生开学,又进入了一个新的学习阶段,那么趁着有时间就总结一下这个课题,分享给大家~
如果你觉得对你有帮助,给我点赞吧!小女子能力有限,也欢迎大家批评指正。

好啦,讲完基础知识,我们开始分布式训练吧(当时做毕设时学校提供的硬件只有cpu,gpu的以后我再试一试)。这部分会涉及代码,如果有疑问的可以问我哈。

Github链接:https://github.com/liyun-lu/CNN-distributed-training-pytorch

卷积神经网络的分布式训练(三)分布式训练实战

一、分布式整体方法设计

我们先来看图,比较直观。
在这里插入图片描述

图1 分布式训练整体流程图

二、分布式训练的实现

处理好数据和建立好模型之后,可以开始对模型进行分布式训练。
分布式训练的过程主要有四个重要的步骤,四个步骤分别是:

1、消息通信

首先,要让所有要运行的机器连接起来进行通信。通信的方式有两种,一是基于TCP/IP协议的网络通信,二是通过分布式共享文件系统通信。
消息通信是分布式训练的核心,这决定了机器之间是否能够连接起来。在PyTorch框架中,使用torch.distributed.init_process_group()函数来初始化进程组以实现机器之间的消息通信。其接口的具体设计如下:

torch.distributed.init_process_group(backend= args.dist_backend,
                             init_method=args.dist_url,
                             timeout=datetime.timedelta(time),
                             world_size=args.world_size,
                             rank=args.rank)

(1)backend=args.dist_backend
这个参数描述了选择的后端,目前最新版本的PyTorch框架提供的后端一共有三种,分别是NCCL、Gloo、MPI,GPU的分布式训练使用的是NCCL,CPU的分布式训练使用的是Gloo,特殊情况下才是用MPI。本次实验使用的计算平台上的机器是通过InfiniBand互连的 CPU 主机,因此使用Gloo后端。

(2)init_method=args.dist_url
init_method参数描述了进程的具体通信方式,本次实验使用的进程初始化方式有以下两种。
①TCP/IP方式初始化,如:init_method=tcp://10.172.1.2:22225。这种方式包含了进程为0的机器的IP地址和端口号,这种方式下机器必须要能够联网通信,所以要确保防火墙和网络设置正确。
②分布式共享文件系统初始化,如init_method=file:///home/share/1。在通信的进程之间存在一个可直接访问的共享空间,这个共享空间可以是虚拟的,它可能分布在不同的机器的私有磁盘上。这个共享空间也可以是一个真实的共享磁盘。

(3)timeout=datetime.timedelta(time)
这个参数定义了进程组运行时的超时时间。当一个进程运行了之后,如果其他的进程迟迟不运行,让运行的进程一直等待连接,如果超过限定的时间,进程就会被杀死。

(4)world_size=args.world_size
这个参数定义了进程的个数,如果是CPU主机的集群就是节点的个数,如果是有GPU的集群就是GPU的卡数。

(5)rank=args.rank
这个参数定义了进程的ID。需要注意的是,每个进程执行的顺序必须要与它的ID相一致,否则就会造成进程的死锁

2、参数同步

PyTorch框架的参数同步机制是Ring Allreduce架构,要调用分布式并行模型(DistributedDataParalle,DDP)接口将模型转换为分布式并行模型,这样不同机器上的模型才能进行参数的同步。

ddp_model = torch.nn.parallel.DistributedDataParallel(model) if use_cuda else torch.nn.parallel.DistributedDataParallelCPU(model)

3、数据划分

PyTorch框架的分布式采用数据并行,所以要调用Distributed Sampler接口将数据平均划分到不同机器上,主要分为三个步骤:

(1)数据定义

train_data = MOFsDataset(data_size=args.data_size, file_path=train_data_path)

(2)数据划分

train_sampler = DistributedSampler(train_data, num_replicas=args.world_size, rank=args.rank)

train_data是我们定义好的数据集;
num_replicas=args.world_size定义了分布式训练进程的个数;rank=args.rank是进程的编号,指定了将数据划分给哪一个进程。

(3)数据加载

train_loader = Data.DataLoader(dataset=train_data, batch_size=args.batch_size, shuffle=True,
sampler=train_sampler) 

sampler=train_sampler是用来防止机器加载全部的数据,而是每台机器只加载一部分的数据进行训练。

4、执行

当我们把程序编写好,并且数据、模型和训练脚本都上传到计算机集群上后,我们可以通过SSH远程登录,创建会话,执行训练脚本开始分布式训练。因为本次实验使用的计算平台并没有使用Slurm集群管理系统,因此执行的办法只能是在多台机器上分别执行训练脚本。例如,在三台机器上进行分布式训练,其执行语句是:

机器一:python train.py --rank 0 --world-size 3
机器二:python train.py --rank 1 --world-size 3
机器三:python train.py --rank 2 --world-size 3

三、实验环境配置

1、硬件环境

在这里插入图片描述

2、软件环境

①操作系统:CentOS Linux release 7.3.1611
②PyTorch版本:PyTorch 1.3.1
③Python版本:Python 3.7.3
④网络带宽:56g fdr InfiniBand
⑤其他:安装Secure Shell(SSH)远程登录管理安全协议

四、实验结果展示及分析

1、实验结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图2 四个节点分布式训练的结果图

2、实验结果分析

(1)节点个数的对比

在这里插入图片描述

图3不同数目节点的训练时间对比图

可以明显的看到,随着机器的数目增多,训练的时间就越短。这毫无疑问的说明了:分布式训练可以减少训练神经网络模型的时间,大大提高效率。

(2)批大小的对比

在这里插入图片描述
在这里插入图片描述

图4 不同Batch_size的训练时间对比图

上图数据量是:10000
下图数据量是:55000
说明了:Batch_size的规模大小对分布式训练很重要。这是和机器的存储大小或资源调度有关系的。因此,在分布式训练中,我们应该要充分考虑系统的资源,适当地调整训练的批大小,不能盲目的增大,只有选择合适的批大小才能实现分布式训练性能的最优化。

(3)通信方式的对比

在这里插入图片描述

图5 不同通信方式的训练时间对比图

从图中可以看到,不论训练的批大小是多少,不同的通信方式下训练时间是差不多一样的,这说明我使用的计算平台的网络通信并没有对分布式训练造成很大的影响,因为所有的节点是通过InfiniBand连接的,带宽还是很快的。

参考资料

  1. 分布式Pytorch介绍
  2. pytorch官方中文文档
  3. pytorch分布式计算配置

参考代码

代码例子 pytorch-distributed-example

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: PyTorch是一个流行的深度学习框架,可以用来构建和训练神经网络模型。在PyTorch中,我们可以使用t-SNE算法来可视化高维数据的相似性和聚类结构。 要绘制t-SNE图,首先需要准备输入数据。通常,我们会将数据转换为PyTorch中的Tensor格式,并根据需要进行归一化或标准化等预处理操作。 接下来,我们可以使用PyTorch提供的t-SNE库,例如`torch_tsne`或`t_sne`,在Tensor数据上运行t-SNE算法。这些库通常提供了一些参数,例如学习率、迭代次数和困惑度等,以控制t-SNE算法的性能和结果。 在运行t-SNE算法后,我们会得到一个二维的降维数据集,可以将其可视化为散点图。为此,我们可以使用诸如Matplotlib或Seaborn等库来绘制图形。通过设置不同的颜色或标记,我们可以进一步突出不同类别或簇的数据点。 最后,我们可以自定义图表的标题、轴标签和图例等,以使图表更易读和理解。如果需要,我们还可以添加其他元素,如网格线或背景色,以增强可视化效果。 总的来说,使用PyTorch绘制t-SNE图的流程包括数据准备、运行t-SNE算法、绘制散点图和自定义可视化设置。这可以帮助我们更好地理解高维数据的结构和相似性。 ### 回答2: PyTorch是一个基于Python的科学计算库,它可以应用于机器学习和深度学习。要绘制t-SNE图(t-distributed stochastic neighbor embedding),首先需要安装并导入相应的库。 1. 安装t-SNE库:可以使用pip命令在命令行中安装t-SNE库,例如执行以下命令: ``` pip install tsnecuda ``` 2. 导入必要的库:在Python代码的开头,我们需要导入PyTorch和t-SNE库: ```python import torch import tsnecuda ``` 3. 准备数据:要绘制t-SNE图,需要将数据转换为PyTorch张量的形式。假设我们有一个数据集`data`,可以使用以下代码将其转换为PyTorch张量: ```python data_tensor = torch.tensor(data) ``` 4. 运行t-SNE算法:使用`t-SNE`类的对象可以进行t-SNE算法的计算。可以设置一些参数,例如维度大小、迭代次数等。以下是一个t-SNE对象的示例代码: ```python tsne = tsnecuda.TSNE(n_components=2, perplexity=30, learning_rate=200) result = tsne.fit_transform(data_tensor) ``` 这将返回一个包含降维后的数据的PyTorch张量`result`。 5. 绘制t-SNE图:最后,可以使用matplotlib库将降维后的数据绘制成t-SNE图。以下是一个绘制二维t-SNE图的示例代码: ```python import matplotlib.pyplot as plt x_coords = result[:, 0] y_coords = result[:, 1] plt.scatter(x_coords, y_coords) plt.xlabel('t-SNE dimension 1') plt.ylabel('t-SNE dimension 2') plt.show() ``` 这将绘制一个散点图,其中x坐标代表t-SNE的第一个维度,y坐标代表t-SNE的第二个维度。 使用上述步骤,我们可以使用PyTorch和t-SNE库绘制并可视化t-SNE图。根据需要调整参数,例如降维维度、迭代次数等,以满足实际应用的要求。 ### 回答3: PyTorch是一个流行的开源深度学习框架,它提供了丰富的工具和函数来加速模型的训练和构建。虽然PyTorch本身不直接支持绘制TSNE图,但可以使用其他库和工具来实现。 要绘制TSNE图,首先需要安装一个适当的Python可视化库,例如Matplotlib或Seaborn。接下来,需要从PyTorch中提取输入数据的特征向量。 可以利用训练好的模型对数据进行预测,并提取相应的特征向量。将这些特征向量传递给TSNE算法,该算法将维度降至2维或3维,以便在散点图上可视化。 下面是一个示例代码: ``` import torch import matplotlib.pyplot as plt from sklearn.manifold import TSNE import seaborn as sns # 加载测试数据 test_data = torch.load('test_data.pt') # 加载训练好的模型 model = torch.load('trained_model.pt') # 提取输入数据的特征向量 features = model(test_data) # 使用TSNE算法降低特征向量维度至2维 tsne = TSNE(n_components=2) tsne_result = tsne.fit_transform(features) # 绘制TSNE图 plt.figure(figsize=(10, 10)) sns.scatterplot(x=tsne_result[:, 0], y=tsne_result[:, 1], hue=labels) plt.title('TSNE Visualization') plt.show() ``` 这是一个简单的示例,你需要根据自己的数据和模型进行适当的修改。通过提取特征向量并使用TSNE算法,可以将高维的数据可视化为二维或三维的散点图,从而更好地理解和分析数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值