博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com
在云上配置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
用于图像预处理和数据增强。curl
和openssl
用于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
。
- 为了容易同步,将 MXNet Python 库打包到工作目录
~/train
下。
cp -r ~/mxnet/python/mxnet .
cp ~/mxnet/lib/libmxnet.so mxnet/
然后复制训练程序:
cp ~/mxnet/example/image-classification/*.py
- 建立一个host文件,将所有从计算机的IPs写入该文件。例如,
cat hosts
:
172.30.0.172
172.30.0.171
- 假定有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的例程。