TensorFlow是由Google Brain团队开发的开源深度学习框架,于2015年首次发布。从发布以来,TensorFlow在学术界和工业界都取得了巨大的成功,成为了目前主流的深度学习框架之一。本文以实践的形式,主要介绍如何在ECS上使用eRDMA来加速Tensorflow应用。
1. 环境配置
1.1 ECS实例配置
在本文中,我们创建了2台g8ae.32xlarge的实例,部属在同一个部属集当中,并且为主网卡配置了eRDMA功能。配置方法参考这篇文档。操作系统选择Alibaba Cloud Linux 2。
1.2 软件安装
软件 | 版本 |
---|---|
Tensorflow | 1.15.5 |
python | 3.6.9 |
gcc | 7.3.1 |
numpy | 1.8.5 |
bazel | 0.26.1 |
我们选择Tensorflow 1.x的最新版本1.15.5,并且源码编译方式来使能添加RDMA的支持。如果已经有了相应的tensorflow的whl包,可以直接安装,不需要每次都重新编译。
按照TF官网的描述,配套的Python版本、编译器版本以及构建工具版本分别如下图所示。我们选择了Python 3.6.9、GCC 7.3.1以及Bazel 0.26.1。
1.2.1 GCC 7的安装
Alinux2当中自带的gcc是4.8.5版本,不符合Tensorflow的编译要求,我们需要更新gcc版本。alinux2当中提供了devtoolset可以方便地在OS内部属不同版本的GCC:
yum install -y alinux-release-experimentals
yum install -y devtoolset-7-gcc devtoolset-7-gdb devtoolset-7-binutils devtoolset-7-make devtoolset-7-gcc-c++
为了在每次登录shell的时候,都默认使能gcc7,可以在~/.bashrc
中添加
source /opt/rh/devtoolset-7/enable
在shell当中使用gcc -v
确认当前gcc版本已经生效:
1.2.2 安装python 3.6.9
我们使用conda来方便管理python的版本。
执行如下命令安装以及初始化conda:
yum install -y conda
conda init bash
# 执行完这一步之后,需要退出shell重新登录
新建一个python 3.6.9的环境
conda create --name test python=3.6.9
切换到python 3.6.9的环境当中:
#使用如下命令来切换到3.6.9环境当中,
conda activate test && python -V
回显如下图所示:
1.2.3 安装bazel
下载bazel的对应版本,并且将其拷贝到系统的path目录当中:
wget https://github.com/bazelbuild/bazel/releases/download/0.26.1/bazel-0.26.1-linux-x86_64
chmod +x bazel-0.26.1-linux-x86_64
mv ./bazel-0.26.1-linux-x86_64 /usr/bin/bazel
1.2.4 编译安装Tensorflow 1.15.5
首先,安装git工具:
yum install -y git
然后安装编译tensorflow的依赖:
pip install 'numpy<1.19.0'
pip install -U pip six wheel mock
pip install future
pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.2 --no-deps
pip install pandas
从github上clone tensorflow仓库:
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout v1.15.5
使用如下命令编译tensorflow:
./configure
export CC=/opt/rh/devtoolset-7/root/usr/bin/gcc; \
export CXX=/opt/rh/devtoolset-7/root/usr/bin/g++; \
bazel build --config=v1 --config=verbs \
//tensorflow/tools/pip_package:build_pip_package
使用如下命令将构建的tensorflow打包
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
最终我们就在/tmp/tensorflow_pkg
下生成了tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl
包,使用如下命令安装:
pip install /tmp/tensorflow_pkg/tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl
我们在另外一个环境上,安装python3.6.9,并将/tmp/tensorflow_pkg/tensorflow-1.15.5-cp36-cp36m-linux_x86_64.whl
拷贝过去,直接使用pip安装即可。
2. benchmark基准测试
我们从github上下载tensorflow的基准测试程序:
git checkout https://github.com/tensorflow/benchmarks.git
cd benchmarks
git checkout 16af178ad312e8c1213efb27a5f227044228bfdf
cd ..
2.2 使用TCP测试
我们在11.0.0.29节点上运行:
CUDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
--ps_hosts=11.0.0.29:9100 \
--worker_hosts=11.0.0.30:9200 \
--job_name=ps \
--local_parameter_device=cpu \
--task_index=0 \
--device=cpu \
--data_format=NHWC \
--server_protocol=grpc
我们在11.0.0.30节点上运行:
UDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
--ps_hosts=11.0.0.29:9100\
--worker_hosts=11.0.0.30:9200 \
--job_name=worker \
--task_index=0 \
--server_protocol=grpc \
--variable_update=parameter_server \
--local_parameter_device=cpu \
--model=resnet50 \
--device=cpu \
--batch_size=16 \
--data_format=NHWC
上述两个命令用于测试TCP时的性能,测试结果如下图所示:
2.2 使用eRDMA测试
Tensorflow使用RDMA时,链接建立采用OOB(out of band,带外)的方式进行,我们需要将erdma的工作模式切换到compat模式以便兼容OOB建链。具体的命令如下:
rmmod erdma
modprobe erdma compat_mode=1
然后我们就可以继续测试eRDMA了。在同样的节点上,将2.1小节中的命令里面的
--server_protocol=grpc
修改为
--server_protocol=grpc+verbs
就可以使用eRDMA,测试结果如下图所示。
对比两次的测试,我们可以看到,仅仅使能了eRDMA,可以在这个benchmark中提升约17%的性能,收益还是比较明显的。