MxNet系列——how_to——cloud

博客新址: http://blog.xuezhisd.top
邮箱:[email protected]


在云上配置MXNet

从头开始设置一个AWS的GPU集群

本节提供了如何设置AWS集群以使用MXNet的详细教程。描述了如何:

  • Use Amazon S3 to host data
  • Set up an EC2 GPU instance with all dependencies installed
  • Build and run MXNet on a single computer
  • Set up an EC2 GPU cluster for distributed training

使用Amazon S3来存储数据

Amazon S3 提供了分布式数据存储,便于存储大数据。使用S3,需要 AWS 证书,它包含一个 ACCESS_KEY_ID 和一个 SECRET_ACCESS_KEY

如果希望在 MXNet 中使用 S3,需要 设置环境变量 AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY,方法是:将下面的2行命令添加到 ~/.bashrc(注意:需要将环境变量的值替换成自己的密匙)。

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

有多种将数据上传到S3的方法。一个简单的方法是使用 s3cmd。例如:

wget http://data.mxnet.io/mxnet/data/mnist.zip
unzip mnist.zip && s3cmd put t*-ubyte s3://dmlc/mnist/

设置一个EC2的GPU实例

MXNet 需要下面的库:

  • 支持C++11的C++编译器。比如, gcc >= 4.8
  • CUDA (CUDNN 可选)。用于GPU线性代数运算
  • BLAS (cblas, open-blas, atblas, mkl, 或其它) 用于CPU线性代数运算
  • opencv 用于图像预处理和数据增强。
  • curlopenssl 用于Amazon S3 存/取数据。

在EC2实例上安装 CUDA,需要较大的功夫。Caffe有一个较好的[教程](https://github.com/BVLC/caffe/wiki/Install-Caffe-on-EC2-from-scratch-(Ubuntu,-CUDA-7,-cuDNN),它描述了如何在Ubuntu 14.04上安装CUDA 7.0。

注意: 2015年11月7日,我们尝试了 CUDA 7.5,但发现存在问题。

你可以使用包管理器来安装剩下的部分。比如,在Ubuntu上:

sudo apt-get update
sudo apt-get install -y build-essential git libcurl4-openssl-dev libatlas-base-dev libopencv-dev python-numpy

Amazon Machine 镜像 ami-12fd8178中包含上面列出的安装包。

在GPU实例上构建和运行 MXNet

下面的命令用于构建支持 CUDA/CUDNN, Amazon S3, 和分布式训练的MXNet。

git clone --recursive https://github.com/dmlc/mxnet
cd mxnet; cp make/config.mk .
echo "USE_CUDA=1" >>config.mk
echo "USE_CUDA_PATH=/usr/local/cuda" >>config.mk
echo "USE_CUDNN=1" >>config.mk
echo "USE_BLAS=atlas" >> config.mk
echo "USE_DIST_KVSTORE = 1" >>config.mk
echo "USE_S3=1" >>config.mk
make -j$(nproc)

为了测试是否安装成功,使用GPU在MNIST上训练一个卷积神经网络(CNN):

python tests/python/gpu/test_conv.py

如果你已经将MNIST数据集放在 s3://dmlc/mnist,你可以使用下面的命令直接读取存储在Amazon S3上的数据:

sed -i.bak "s!data_dir = 'data'!data_dir = 's3://dmlc/mnist'!" tests/python/gpu/test_conv.py

注意: 你可以使用命令 sudo ln /dev/null /dev/raw1394 来修复 OpenCV 错误 libdc1394 error: Failed to initialize libdc1394

配置一个EC2 GPU集群,用于分布式训练

一个集群包含多个电脑。你可以使用安装了MXNet的电脑作为主电脑(Root),用于提交作业,并启动一些从电脑(slave)来执行作业。比如,使用AMI启动多个实例,镜像ami-12fd8178已经安装了依赖。有2个选项:

  • 让所有从电脑(主电脑一样)的端口可访问,通过在安全用户组中设置类型:TCP,源:任何地方来实现。
  • 使用相同的 pem 作为主计算机来访问所有从计算机,然后将 pem 文件复制到主计算机的 ~/.ssh/id_rsa 文件中。如果已经这样操作,主计算机能通过SSH来访问所有的从计算机。

现在,在多个电脑中运行CNN。假定在主计算机的一个工作目录下,比如 ~/train,且MXNet位于 ~/mxnet

  1. 为了容易同步,将 MXNet Python 库打包到工作目录 ~/train 下。
cp -r ~/mxnet/python/mxnet .
cp ~/mxnet/lib/libmxnet.so mxnet/

然后复制训练程序:

cp ~/mxnet/example/image-classification/*.py 
  1. 建立一个host文件,将所有从计算机的IPs写入该文件。例如,cat hosts
172.30.0.172
172.30.0.171
  1. 假定有2个计算机,使用2个workers训练CNN:
../../tools/launch.py -n 2 -H hosts --sync-dir /tmp/mxnet python train_mnist.py --kv-store dist_sync

注意: 有时候,即使你在主节点上已经按下 Ctrl-c,从节点上的作业依然存在。使用下面的命令终止它们:

cat hosts | xargs -I{} ssh -o StrictHostKeyChecking=no {} 'uname -a; pgrep python | xargs kill -9'

***注意:***上面使用的模型很简单,很容易训练,因此这不是一个比较好的分布式训练的基准。考虑使用其它 例程。

更多选项

使用多个数据块

将一个数据集分成几个文件很常见,尤其是在分布式环境下。MXNet支持直接从多个数据块加载数据。将所有的记录文件放到一个文件夹,并设置数据路径指向该文件夹。

使用 YARN 和 SGE

当没有集群调度框架时,使用SSH比较简单。MXNet被设计成能在不同平台之间具有可移植性。我们在tracker中提供了其它的脚本,以便于在其它集群框架(包括Hadoop-YARN和SGE)下运行MXNet。我们欢迎你贡献在你喜欢的分布式平台上运行MXNet的例程。

你可能感兴趣的:(MxNet,深度学习,MxNet)