MxNet系列——how_to——multi_devices

2023-05-16

博客新址: 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 的更多选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MxNet系列——how_to——multi_devices 的相关文章

  • MxNet学习:优化深度学习中的内存消耗

    在过去的十年中 xff0c 深度学习的一个持续的趋势是向更深更大的网络发展 尽管硬件性能迅速提高 xff0c 但先进的深度学习模型仍在不断挑战GPU RAM的极限 因此 xff0c 即使在今天 xff0c 人们仍然希望找到一种方法来训练更大
  • MxNet系列——how_to——visualize_graph

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 如何将神经网络可视化为计算图 该章节描述了如何在MXNet中使用在mx viz plot network来可视化 xff08
  • MxNet系列——how_to——smart_device

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 将深度学习库压缩成一个文件 xff0c 以便移植到智能设备中 深度学习系统是复杂的 xff0c 并且常常有些依赖环境 将深度学
  • MxNet系列——how_to——multi_devices

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 在多个CPU GPUs上以数据并行方式运行MXNet MXNet 支持在多个CPUs和GPUs上进行训练 其中 xff0c 这
  • MxNet系列——how_to——develop_and_hack

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 开发和 Hack MXNet 创建新的操作符在MXNet中使用Torch设置MXNet的环境变量 其它资源 概述 MXNet的
  • MxNet系列——how_to——bucketing

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 在MXNet中使用Bucketing Bucketing是一种训练多个不同但又相似的结构的网络 xff0c 这些网络共享相同的
  • MxNet系列——get_started——windows_setup

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com Windows上安装 MXNet 在Windows上 xff0c 你可以直接下载和安装已经编译过的MXNet工具包 xff0c
  • MxNet系列——community——contribute

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 对MXNet做贡献 MXNet是由一群活跃的社区成员开发和使用的 请对其贡献 xff0c 以改善它 当你的补丁被合并时 xff
  • WoodScape: A multi-task, multi-camera fisheye dataset for autonomous driving

    Paper name WoodScape A multi task multi camera fisheye dataset for autonomous driving Paper Reading Note URL https opena
  • how to solveE:Unmet dependencies.Try‘apt --fix ^^^^^

    span class token function sudo span span class token function apt span span class token function install span span class
  • 论文超详细精读:SMPL: A Skinned Multi-Person Linear Model

    文章目录 前言总览一 Introduction二 Related WorkBlend Skinning xff08 混合蒙皮 xff09 Blend shapes xff08 混合变形 xff09 Learning pose and sha
  • HOW TO install nam for ns2 on debian

    Debian is convinent to install software packages for the tool aptl Like many other packages we can use apt get install n
  • Mxnet 源码编译

    源码拷贝下来 git clone recursive https github com dmlc mxnet 郭峰把openblas安装好了 cd mxnet make j 24 USE OPENCV 1 USE BLAS openblas
  • 配置MXNET、Pytorch、Tensorflow环境详细教程

    最近学习计算机视觉 用了两天配置了三个框架的环境 配置过程可谓是十分艰辛 特此写个博客来记录配置过程 等忘记了可以回来看看 无论配置何种框架的环境 都离不开一个宝贝应用 anaconda 这是一个配置虚拟环境的宝贝应用 有着无限可能 当然
  • MXNET下载训练好的模型

    MXNet中有很多训练好的模型 直接在网页上下载一直报错 后来在https github com apache incubator mxnet blob master example image classification common
  • 使用MXNet完成一个基于FCN的盲道实时语义分割

    使用MXNet完成一个基于FCN的盲道识别语义分割 一点说明 基本原理 测试集效果 数据标注 训练 基本设置 读入数据 网络构建 开始训练 测试 一点说明 前段时间根据gluon的教程动手学深度学习和同学项目实地拍摄的盲道图片完成了一个基于
  • ubuntu14.04安装CUDA7.0、CUDNN7.0详细步骤

    一 安装CUDA7 0 CUDA 7 0在Linux下的安装步骤参见官网手册 CUDA Getting Started Linux 其中提及了 run deb 等安装 1 检查你的电脑是否支持CUDA 检查GPU是否支持 输入如下命令 如果
  • 使用 mxnet 的简单梯度下降

    我正在尝试使用 MXNet 的梯度下降优化器来最小化函数 Tensorflow 中的等效示例是 import tensorflow as tf x tf Variable 2 name x dtype tf float32 log x tf
  • 使用 MXnet 时如何保存模型

    我正在使用 MXnet 训练 CNN 在 R 中 并且可以使用以下代码训练模型 不会出现任何错误 model lt mx model FeedForward create symbol network X train iter ctx mx
  • MXNet:nn.Activation 与 nd.relu?

    我是 MXNet 新手 我在 Python3 中使用它 他们的教程系列鼓励您定义自己的gluon blocks http gluon mxnet io chapter03 deep neural networks plumbing html

随机推荐

  • PCL系列——三维重构之贪婪三角投影算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之移动立方体算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • 解决Ubuntu中文显示为乱码

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 1 安装所需软件 sudo apt get install zh autoconvert sudo apt get insta
  • hexo教程系列——hexo安装教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文详细描述了如何在Github上 xff0c 使用hexo部署博客 安装Hexo 安装node js node js官方下载
  • Python中类成员函数均为虚函数的理解

    python中类成员函数均为虚函数 我们可以通过下面的函数见识其威力 class A def foo self print 39 a 39 class B A def foo self print 39 b 39 for x in A B
  • MxNet系列——Windows上安装MxNet

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 开发环境 操作系统 xff1a Win7 64bit C 43 43 编译器 xff1a Visual Studio 2010
  • Eigen教程1 - 基础

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 固定大小的矩阵和向量 参考链接 xff1a http eigen tuxfamily org dox 2 0 Tutorial
  • Eigen教程2 - 入门

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 安装Eigen 无需安装 只需将Eigen位置添加到include路径中 Demo 1 MatrixXd xff0c X表示动
  • Eigen教程3 - 稀疏矩阵操作

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 稀疏矩阵操作 操作和求解稀疏问题需要的模块 xff1a SparseCore SparseMatrix 和 SparseVec
  • Eigen教程4 - 稀疏矩阵快速参考指南

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文对稀疏矩阵SparseMatrix的主要操作进行了总结 首先 xff0c 建议先阅读 Eigen教程2 稀疏矩阵操作 关于
  • Eigen教程5 - 求解稀疏线性方程组

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com Eigen中有一些求解稀疏系数矩阵的线性方程组 由于稀疏矩阵的特殊的表示方式 xff0c 因此获得较好的性能需要格外注意 查看
  • Eigen教程6 - Matrix-free solvers

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com Matrix free solvers 像ConjugateGradient 和 BiCGSTAB这样的迭代求解器可以用在 m
  • Eigen教程7 - Eigen和Matlab的比较

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com Eigen和Matlab比较 参考 http eigen tuxfamily org dox AsciiQuickRefere
  • MxNet系列——how_to——perf

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 性能 下面是一些技巧 xff0c 以尽可能的获取MXNet的最佳性能 数据 对于输入数据 xff0c 需要注意以下内容 xff
  • MxNet系列——how_to——visualize_graph

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 如何将神经网络可视化为计算图 该章节描述了如何在MXNet中使用在mx viz plot network来可视化 xff08
  • 修改antlr错误信息输出格式的方法

    找到 antlr DefaultFileLineFormatter java 修改类DefaultFileLineFormatter的函数getFormatString 我将其修改如下 以适应vc的错误信息输出格式 package antl
  • MxNet系列——how_to——torch

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 如何将MXNet用作Torch的前后端 本章节描述了如何将MXNet用作Torch的两个主要功能 xff08 前端和后端 xf
  • MxNet系列——how_to——smart_device

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 将深度学习库压缩成一个文件 xff0c 以便移植到智能设备中 深度学习系统是复杂的 xff0c 并且常常有些依赖环境 将深度学
  • MxNet系列——how_to——new_op

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 如何创建新的操作符 网络层 本节内容描述了创建新的MXNet操作符 xff08 或网络 xff09 的过程 我们已经尽了最大努
  • MxNet系列——how_to——multi_devices

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 在多个CPU GPUs上以数据并行方式运行MXNet MXNet 支持在多个CPUs和GPUs上进行训练 其中 xff0c 这