博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


在多个CPU/GPUs上以数据并行方式运行MXNet

MXNet 支持在多个CPUs和GPUs上进行训练。其中,这些CPUs和GPUs可能位于不同的物理机上。

数据并行 vs 模型并行

MXNet模式使用数据并行的方式将工作负载划分到多个设备上。假如有 n 个设备,每一个设备都将获得完整的模型,并使用 1/n 的数据进行训练。结果(比如,梯度)和更新后的模型在不同设备之间进行通信。

MXNet也支持模型并行。这时,每个设备上维护模型的一部分。当模型非常大以至于单个设备无法存储时,模型并行非常有用。有一个关于如何在多层LSTM上使用模型并行方法的教程 a tutorial 。本教程主要关注 数据并行

单机上的多个GPUs

划分工作负载

MXNet 默认会将一个数据批均匀地划分到每一个GPU上。加入批大小是 b,GPUs的数目是 k,因此在每一次迭代过程中,每一个GPU将会在 b/k 个样本上执行前向和后向传播。在更新模型之前,会将所有GPUs上的梯度都加起来。

如何使用

为了使用 GPUs,需要编译支持GPU的MXNet。
比如,在配置文件 config.mk 中设置 USE_CUDA=1,然后再 make
(更多选项,请查看 MXNet installation guide)。

如果一台主机安装了一个或多个GPU,每个GPU都会有一个编号(编号从0开始计数)。如果想使用某个特定的显卡,既可以指定在代码中指定环境(context) ctx;也可以在命令行中传递参数 --gpus。例如,如果想在Python中使用GPU 0和GPU 2,可以使用下面的代码创建网络模型。

import mxnet as mx
#列表包含多个GPU
model = mx.model.FeedForward(ctx=[mx.gpu(0), mx.gpu(2)], ...)

如果程序接受参数 --gpus ,比如 example/image-classification,那么可以尝试下面的代码。

python train_mnist.py --gpus 0,2 ...

高级用法

如果多个GPUs的计算能力不同,那么可以根据它们的计算性能来划分工作负载。比如,如果GPU 0 是 GPU 2 性能的3倍,那么可以提供一个额外的负载选项 work_load_list=[3, 1]。更多信息,请查看 model.fit。

如果所有其它超参都相同,在多个GPUs上训练结果应该和单GPU上的训练结果相同。但在实际应用中,由于随机存取(随机顺序或其它augmentations),使用不同的种子初始化权重和CuDNN,结果可能不同。

我们可以控制梯度聚合和模型更新(如果执行,训练过程)的位置,通过创建不同的 KVStore(它是数据通信模块)。既可以使用 mx.kvstore.create(type) 来创建一个实例,也可以使用程序的参数 --kv-store type 来实现功能。

有两个常用的类型,

  • local: 所有的梯度都复制到CPU内存,并且权重也在那里进行更新。
  • device: 梯度聚集和权重更新都在GPU上进行。它也会尝试使用GPU的P2P通信(它可以加速通信)。但该选项会使用更多的GPU内存。

如果有大量的GPU(比如,>=4),我们建议使用 device,以获得更佳性能。

使用多个机器进行分布式训练

我们可以通过简单地修改 KVStore ,实现在多个机器上运行MXNet。

  • dist_sync。 它的行为和 local相似。但一个主要区别是 batch-size 此处表示每个机器上的批大小。机器数量为 n,批大小为 bdist_sync的行为等价于 批大小为 n/b local类型。
  • dist_device_sync。它 和 dist_sync之间的区别,与 devicelocal之间的区别相同。即梯度聚集和权重更新都在GPU上进行。
  • dist_async 。它执行一步更新。 一旦从任何机器上接收到梯度,立即更新权重。这种更新是具有原子性(不可分),即同一权重在相同的时间不可能出现两个更新。然而却无法保证顺序。

如何启动一个作业

如果使用分布式训练,需要先设置 USE_DIST_KVSTORE=1,再进行编译。
(更多选项,请查看 MXNet installation guide)。

启动一个分布式作业和单机运行稍有不同。MXNet 提供了 tools/launch.py ,它利用 ssh, mpi, sge, 或 yarn 启动作业。

假定我们位于目录 mxnet/example/image-classification 下。希望在数据集mnist上使用脚本 train_mnist.py 训练LeNet。

单机运行时的命令:

python train_mnist.py --network lenet

现在有两个可以使用SSH进行通信的机器,我们希望在这两个机器上训练网络。首先,将这两个主机的IPs或主机名保存在 hosts 文件中。比如,

$ cat hosts
172.30.0.172
172.30.0.171

接下来,两个机器需要都可分访问mxnet文件夹,比如 网络文件系统。

运行以下命令,将在多机上启动MXNet。

../../tools/launch.py -n 2 --launcher ssh -H hosts python train_mnist.py --network lenet --kv-store dist_sync

注意:除了包括单机运行参数,此处还需:

  • 使用 launch.py 来提交作业。
  • --launcher 提供启动器。如果所有的机器可以互相ssh,那么使用 ssh;如果 mpirun 可用,那么使用 mpi; 如果Sun公司的网格引擎(Sun Grid Engine)可用,使用 sge;如果Apache Yarn可用,使用 yarn
  • -n 计算节点(worker nodes)的数量
  • -H 指定host文件( sshmpi 使用)
  • --kv-store 使用 dist_syncdist_async

同步目录

现在开始考虑 MXNet 文件夹不可访问的情况。我们可以先MXNet库复制到当前目录。

cp -r ../../python/mxnet .
cp -r ../../lib/libmxnet.so mxnet

然后,使用 launch.py 和参数 --sync-dst-dir 将当前目录同步到所有机器的 /tmp/mxnet 目录下。

../../tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet \python train_mnist.py --network lenet --kv-store dist_sync

使用一个特定的网络接口

MXNet 一般会选择第一个可用的网络接口。但对于有多个接口的机器,我们通过环境变量 DMLC_INTERFACE 可以指定使用哪个网络接口进行数据通信。例如,下面的代码中使用了网络接口 eth0

# 前面的命令设置网络接口(网卡)
# 后面的命令和上面相同
export DMLC_INTERFACE=eth0; ../../tools/launch.py ...

调试连接

通过设置 PS_VERBOSE=1,可以查看调试日志。比如,

export PS_VERBOSE=1; ../../tools/launch.py ...

更多资料

  • 通过命令 ../../tools/launch.py -h 查看更多启动选项。
  • 查看 ps-lite 的更多选项。

MxNet系列——how_to——multi_devices相关推荐

  1. MxNet系列——how_to——new_op

    博客新址: http://blog.xuezhisd.top 邮箱:xuezhisd@126.com 如何创建新的操作符(网络层) 本节内容描述了创建新的MXNet操作符(或网络)的过程. 我们已经尽 ...

  2. MxNet系列——how_to——faq

    博客新址: http://blog.xuezhisd.top 邮箱:xuezhisd@126.com 常见问题 本节回答了 mxnet/issues上的常见问题.在提问前,请先检查该页面.如果你想要贡 ...

  3. mxnet系列教程之1-第一个例子

    第一个例子当然是mnist的例子 假设已经成功安装了mxnet 例子的代码如下: cd mxnet/example/image-classification python train_mnist.py ...

  4. mxnet系列 安装

    caffe一样,编译的时候用make 或者make -8 会遇到如下的错误 include/mxnet/./base.h:50:2: error: #error "Currently we ...

  5. MxNet系列——Windows上安装MxNet

    博客新址: http://blog.xuezhisd.top 邮箱:xuezhisd@126.com 开发环境 操作系统:Win7 64bit C++编译器:Visual Studio 2010 Py ...

  6. mxnet系列3-hello,mxnet

    mxnet的helloword程序 mxnet的是用c++写成的,但基于mxnet的编程可以使用各种语言接口,这里老衲使用python作为接口 环境的准备如下 wget https://bootstr ...

  7. mxnet实战系列(一)入门与跑mnist数据集

    最近在摸mxnet和tensorflow.两个我都搭起来了.tensorflow跑了不少代码,总的来说用得比较顺畅,文档很丰富,api熟悉熟悉写代码没什么问题. 今天把两个平台做了一下对比.同是跑mn ...

  8. win10双系统ubuntu安装+卸载driver+cuda+cudnn+anaconda+mxnet编译(好文推荐+实际动手填坑系列)

    写在 2021.8.4 的话,最近刚弄的这些,许多东西还记得,如果大家有什么问题,可以在评论区留言,我应该能回答上来一些. 安装参考: (root空间分配那儿要注意,我一开始是分配20G,结果还在安装 ...

  9. MXNET源码中NDArray数据的获取和打印

    虽然本人也很想写一个系列的分析文章,奈何水平不足,零零碎碎学到一点就写一点吧 本人是想学习MXNET的源码,首先想要添加一些打印,debug一下,第一个问题是如何在C++源码中打印出NDArray结构 ...

最新文章

  1. 【错误总结】LaTex Warning: citation undefined
  2. RCON 服务器命令协议
  3. 一头感动了全中国的“猪”!感动了全世界!泪奔
  4. Java反序列s ysoserial Spring
  5. mybatis-plus中的select
  6. 文本分类-TextCNN
  7. oracle erp 设置文档,Oracle ERP管理手册
  8. 刷ROM必備的clockworkmod recovery
  9. iOS15绕过激活锁工具TiggerRamDisk3.6,支持最新iOS15.5绕过
  10. 在xilinx SDK中查询API函数的方法
  11. VB.Net教程图书目录
  12. JAVA面向对象中继承子父类构造函数-子类的实例化过程-图解
  13. matlab各相关系数的计算,matlab 相关系数的计算
  14. Excel表格快捷键的另类用法。
  15. win10系统64位( 惠普)台式电脑自动开机、关机图文详细解(一)
  16. 软件测试用例执行日报,软件测试之测试用例执行.docx
  17. 在注册表里查找classid
  18. unity warning CS0108: test4.name' hides inherited memberUnityEngine.Object.name’.
  19. Entrust 将不再签发超过13个月有效期的SSL证书
  20. redis 无法启动

热门文章

  1. OSGEarth解决南北极空洞问题
  2. Crack:::Stimulsoft Ultimate 2023.1.2
  3. 给FLASH加链接的方法
  4. 怎么快速发表期刊论文
  5. ffmpeg源码分析 (二)
  6. 中国彩妆行业营销现状分析与投资机会研究报告2022版
  7. dataguard 日志的应用
  8. js时间分割——主要用途——租赁合同时间计算(两种时间分割方式,可以按月,季,年分割)
  9. java判断单元格是否是日期_Excel单元格,日期/时间返回Int而不是日期/时间字符串...
  10. 推荐算法最前沿|CIKM2020推荐系统论文一览