如何在AWS上安装使用分布式TensorFlow

6791人阅读
原文链接:
原文作者在第一段就说啦,如果想省事的话,直接用他的就好啦~
使用AWS的好处是便宜,使用竞价性的价格每小时只要几毛钱,而且以后随时随地都可以跑程序啦~~
还不太明白的小伙伴可以参考youtube上的教程,自备梯子:
The following post describes how to install TensorFlow 0.6 on an Amazon EC2
Instance with GPU Support. I also created a
(ami-e191b38b) with the resulting setup. Feel free to use it.
UPDATED (28 Jan 2016): The latest TensorFlow build requires Bazel 0.1.4. Post now reflects
this. Thanks to
for his assistance.
UPDATED (28 Jan 2016): The AMI provided now exports env variables in ~/.bashrc.
The following things are installed:
Essentials
Cuda Toolkit 7.0
cuDNN Toolkit 6.5
Bazel 0.1.4 (Java 8 is a dependency)
TensorFlow 0.6
To get going, I recommend requesting a spot instance. Can your instance go away?
Sure. But 0.07/hrismuchnicerthan0.65/hr when you are figuring things out.
I launched a single g2.2xlarge instance using the Ubuntu Server 14.04 LTS AMI.
After launching your instance, install the essentials:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential git python-pip libfreetype6-dev libxft-dev libncurses-dev libopenblas-dev gfortran python-matplotlib libblas-dev liblapack-dev libatlas-base-dev python-dev python-pydot linux-headers-generic linux-image-extra-virtual unzip python-numpy swig python-pandas python-sklearn unzip wget pkg-config zip g++ zlib1g-dev
sudo pip install -U pip
TensorFlow requires installing CUDA Toolkit 7.0. To do this, run:
sudo dpkg -i cuda-repo-ubuntu-28_amd64.deb
rm cuda-repo-ubuntu-28_amd64.deb
sudo apt-get update
sudo apt-get install -y cuda
At some point, you get the following message: Reboot your computer and verify
that the NVIDIA graphics driver can be loaded. I mean, it’s 2016. But
whatevs. We’ll reboot in a moment. Now, we need to download
After filling out an annoying questionnaire, you’ll download a file named
cudnn-6.5-linux-x64-v2.tgz. You need to transfer it to your EC2 instance: I
did this by adding it to my Dropbox folder and using
to upload it. Once you have uploaded
it to your home directory, run the following:
tar -zxf cudnn-6.5-linux-x64-v2.tgz && rm cudnn-6.5-linux-x64-v2.tgz
sudo cp -R cudnn-6.5-linux-x64-v2/lib* /usr/local/cuda/lib64/
sudo cp cudnn-6.5-linux-x64-v2/cudnn.h /usr/local/cuda/include/
Okay, now reboot:
sudo reboot
Next up, we’ll add some environment variables. You may wish to add these to your
~/.bashrc.
export CUDA_HOME=/usr/local/cuda
export CUDA_ROOT=/usr/local/cuda
export PATH=$PATH&/span&:&span class="nv"&$CUDA_ROOT/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH&/span&:&span class="nv"&$CUDA_ROOT/lib64
Getting closer. We need to install
requires Java 8. For more details, see
Install Java 8 first.
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
# Hack to silently agree license agreement
echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
sudo apt-get install -y oracle-java8-installer
Now for Bazel. (Thanks to Jim Simpson for this block.)
sudo apt-get install pkg-config zip g++ zlib1g-dev
chmod +x bazel-0.1.4-installer-linux-x86_64.sh
./bazel-0.1.4-installer-linux-x86_64.sh --user
rm bazel-0.1.4-installer-linux-x86_64.sh
Okay, almost done. Let’s clone the TensorFlow repo and initialize all submodules
using their default settings.
git clone --recurse-submodules
cd tensorflow
Finally, we are going to build TensorFlow with GPU support using CUDA version
3.0 (currently required on AWS) via the unofficial settings.
TF_UNOFFICIAL_SETTING=1 ./configure
When you see the following message, type 3.0 to use CUDA version 3.0:
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: .
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]: 3.0
If you forget to type 3.0, you’ll get the following error later on:
Ignoring gpu device (device: 0, name: GRID K520, pci bus id: .0) with Cuda compute capability 3.0. The minimum required Cuda capability is 3.5.
Other than that, I went with all the default options, resulting in the nice
WARNING: You are configuring unofficial settings in TensorFlow. Because some
external libraries are not backward compatible, these settings are largely
untested and unsupported.
Pffft. Anyway, last steps. These take quite a while (~24 minutes for me).
bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.6.0-cp27-none-linux_x86_64.whl
Congrats! TensorFlow is installed. At this point, if you launch Python and run
the following code, you’ll see a lot of nice messages indicating your GPU is set
up properly:
import tensorflow as tf
tf_session = tf.Session()
x = tf.constant(1)
y = tf.constant(1)
tf_session.run(x + y)
You can also check that TensorFlow is working by training a
python ~/tensorflow/tensorflow/models/image/mnist/convolutional.py
# Lots of output followed by GPU-related things…
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties:
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID .0
Total memory: 4.00GiB
Free memory: 3.95GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0:
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:0) -& (device: 0, name: GRID K520, pci bus id: .0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Allocating 3.66GiB bytes.
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:52] GPU 0 memory begins at 0x extends to 0x7ec556000
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:66] Creating bin of max chunk size 1.0KiB
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:66] Creating bin of max chunk size 2.0KiB
Initialized!
Epoch 0.00
Minibatch loss: 12.053, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
Epoch 0.12
Minibatch loss: 3.282, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 6.9%
Epoch 0.23
Minibatch loss: 3.466, learning rate: 0.010000
Minibatch error: 12.5%
Validation error: 3.7%
Epoch 0.35
Minibatch loss: 3.191, learning rate: 0.010000
Minibatch error: 7.8%
Validation error: 3.4%
Epoch 0.47
Minibatch loss: 3.201, learning rate: 0.010000
Minibatch error: 4.7%
Validation error: 2.7%
I borrowed instructions from
, so thanks
very much to them. If you want more information about the various options, check
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:139093次
积分:1084
积分:1084
排名:千里之外
原创:17篇
转载:23篇
评论:22条
(1)(1)(1)(1)(8)(5)(3)(8)(1)(6)(1)(1)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'【大咖专栏 | 如何在AWS上安装使用分布式TensorFlow】 - 联盟推荐_【北京联盟】
大咖专栏 | 如何在AWS上安装使用分布式TensorFlow
/ 作者:小易
北京联盟摘要:【大咖专栏 | 如何在AWS上安装使用分布式TensorFlow】上一篇:
下一篇: 。大咖专栏 大咖专栏主要刊登亚马逊AWS诸位大咖亲自撰写的Blog,内容涉猎广泛,话题讨论前沿,且与实战紧密相连。我们非常欢迎小伙伴们在评论区留言,与大咖互动交流! 今天为大家撰文的大咖,是亚马逊AWS解决方案架构师——邓明轩老师。 邓明轩 亚马逊AWS解决
大咖专栏大咖专栏主要刊登亚马逊AWS诸位大咖亲自撰写的Blog,内容涉猎广泛,话题讨论前沿,且与实战紧密相连。我们非常欢迎小伙伴们在评论区留言,与大咖互动交流!今天为大家撰文的大咖,是亚马逊AWS解决方案架构师——邓明轩老师。邓明轩亚马逊AWS解决方案架构师邓明轩拥有15年IT 领域的工作经验,先后在IBM、RIM、Apple 等企业担任工程师、架构师等职位。邓明轩目前就职于AWS,担任解决方案架构师一职。他喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。邓明轩同样喜欢新技术,喜欢各种技术挑战,目前正在集中精力学习分布式计算环境下的机器学习算法。大咖有话说近几年来,深度学习得到了长足的发展,伴随着深度学习的发展,深度学习框架也变得越来越为人们所熟知。TensorFlow是谷歌开源的深度学习框架,自开源以来得到了业界的认可和支持,特别是在TensorFlow分布式版本发布以后,更多的深度学习专业人士开始使用TensorFlow进行分布式的深度学习研究。深度学习框架底层需要硬件资源的支持,特别需要GPU实例的支持,而AWS云端弹性的GPU实例无疑是深度学习从业人员手中最灵活的资源。本文将介绍在AWS上使用GPU实例安装配置分布式TensorFlow的过程,希望可以让读者快速搭建自己的深度学习环境,将其尽快深入到自己的生产应用和研究中。环境准备首先我们需要为TensorFlow安装准备基础环境,其中包括AWS账号的创建,IAM用户的创建,VPC的划定等工作。有关这些具体工作的细节在本文就不详细讲述了,这些方面的细节请参考相关博文或者技术文档。准备好账号之后就需要启动两台GPU实例进行设置,考虑到启动实例后需要进行一些软件部署,建议先启动一台GPU实例,安装设置好TensorFlow之后创建实例的AMI镜像,然后通过镜像启动第二台GPU实例,这样比较节省时间。本文以Ubuntu作为基础环境,所以在启动实例的时候选择操作系统时选择Ubuntu镜像。进一步需要做的是选择实例类型,在AWS上的GPU实例有G2和P2两种大的类型。P2使用了NVIDIA的K80 GPU,实例的具体配置如下:G2使用了NVIDIA的K520 GPU,实例具体配置如下:选择你希望使用的实例类型,然后按照EC2启动向导启动该实例。关于EC2启动的不同选项请参考相关文档,这里需要留意的是“置放组”选项,如果我们启动多个EC2实例运行TensorFlow并进行分布式计算,把这些实例放在一个“置放组”内会有效提高实例间的通讯效率。实例启动后通过SSH工具连接到该实例上开始安装过程。安装TensorFlow准备好EC2实例后,通过SSH工具连接到实例上,开始以下安装工作。因为TensorFlow安装需要较长时间,所以建议连接到EC2实例上以后通过screen命令或者tmux命令启动session管理,这样安装过程中出现SSH连接中断也可以继续完成安装工作。首先需要安装相关的依赖包,具体命令如下:sudo apt-get updatesudo apt-get upgradesudo apt-get install -y build-essential git python-pip libfreetype6-dev libxft-dev libncurses-dev libopenblas-dev gfortran python-matplotlib libblas-dev liblapack-dev libatlas-base-dev python-dev python-pydot linux-headers-generic linux-image-extra-virtual unzip python-numpy swig python-pandas python-sklearn unzip wget pkg-config zip g++ zlib1g-devsudo pip install -U pip安装完依赖包以后接着安装CUDA包,本例中我是直接下载了CUDA 8.0的本地deb包进行安装,安装命令如下,读者在参考使用以下命令时注意修改对应的URL链接和版本号:wget /compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu-local_8.0.44-1_amd64-deb -O cuda-repo-ubuntu-local_8.0.44-1_amd64.debsudo dpkg -i cuda-repo-ubuntu-local_8.0.44-1_amd64.debsudo apt-get updatesudo apt-get install cudaCUDA安装比较简单,主要时间消耗在下载CUDA安装包上。安装了CUDA包以后,可以通过nvidia-smi命令查看本地的GPU设备情况,一方面检查GPU硬件情况,一方面也可以确认CUDA安装是否成功。在我的G2.xlarge实例上安装CUDA并执行nvidia-smi命令后输出如下:安装了CUDA后接着安装CuDNN,安装CuDNN需要到NVIDIA网站上注册,注册以后才能下载。这里略去注册过程,读者可以自行到以下网站注册:/rdp/cudnn-download我下载的是cudnn-8.0-linux-x64-v5.1.tgz文件,下载后的安装命令如下:tar -zxf ./cudnn-8.0-linux-x64-v5.1.tgzsudo cp -R cuda/lib64/* /usr/local/cuda-8.0/lib64sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/然后我们需要设置一些环境变量,我将以下配置加入~/.bashrc文件中,并用source ~/.bashrc命令让配置生效。export CUDA_HOME=/usr/local/cuda-8.0export CUDA_ROOT=/usr/local/cuda-8.0export PATH=$PATH:$CUDA_ROOT/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_ROOT/lib64安装了NVIDIA的相关组件后我们还需要安装Bazel,为了安装Bazel,我们需要先安装Java8,具体命令如下:sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installer安装Java8会有图形化向导,按照向导指引安装就好了。安装了Java8以后执行以下命令安装Bazel:echo "deb [arch=amd64] /bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.listcurl /bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -sudo apt-get update && sudo apt-get install bazelsudo apt-get upgrade bazel经过以上准备,相关的软件都已安装配置好,可以开始编译TensorFlow了。首先把TensorFlow项目克隆到本地:git clone --recurse-submodules /tensorflow/tensorflow接着进入tensorflow目录并运行configure命令为编译做准备,注意要加上sudo,否则会出现权限的问题。cd tensorflowsudo ./configure执行./configure会出现文本配置界面,在选择不同选项时几乎可以都使用缺省值,当然在选择是否有GPU支持时要选择Y,然后就是要注意“Cuda compute capability”一项,如果你选择的实例类型是G2,这里需要输入3.0。因为G2实例使用的GPU是K520,只能支持Cuda compute capability 3.0。如果你选择的机型是P2,因为使用的GPU是K80,可以使用缺省的Cuda compute capability,本例使用的TensorFlow版本缺省的是3.5。具体选项请参考以下截图:如果你为G2实例类型选择了3.5或者更高版本,运行TensorFlow时会出现以下错误信息:Ignoring visible gpu device (device: 0, name: GRID K520, pci bus id: .0) with Cuda compute capability 3.0. The minimum required Cuda capability is 3.5.配置好以后通过Bazel命令编译,注意使用sudo命令:sudo bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package编译需要一段时间,编译完成后使用buildpippackage命令为python构建pip包,以下命令中的/tmp/tensorflow_pkg目录是pip包输出的临时文件,可以根据你自己的环境进行调整:sudo bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg构建了pip包以后使用pip命令进行安装,注意以下命令中的/tmp/tensorflow_pkg/tensorflow-0.11.0-cp27-cp27mu-linux_x86_64.whl是上一个命令生成的whl包文件路径,其中包括了具体的版本号,在你自己编译的时候需要留意这个版本号是否有变化:sudo pip install /tmp/tensorflow_pkg/tensorflow-0.11.0-cp27-cp27mu-linux_x86_64.whl以上命令执行完以后就成功安装了TensorFlow了,可以开始测试了。测试与分布式部署神经网络的测试经常使用mnist数据集来进行。TensorFlow中自带了mnist的样例,安装好TensorFlow以后通过以下命令可以进行测试:python tensorflow/tensorflow/models/image/mnist/convolutional.py一切正常的话,很快convolutional.py命令就可以执行完成,结束后会输出准确率。测试结束后,进一步需要做的事情就是分布式部署。如开篇讲到的,在AWS上可以使用镜像(AMI)简化新实例启动过程中的安装工作。基本做法就是选中以上步骤配置的EC2实例,然后选择“操作执行镜像创建”的操作。当我们需要启动第二台GPU实例时,选择刚创建的镜像进行启动就好了。启动第二台实例时注意选择第一台实例使用的子网,减少其它因素的干扰。如果对网络性能有特别要求,还可以将两台实例放在同一个“置放组”中,提高两台GPU实例之间的网络通讯速度。另外,如下文所示,TensorFlow不同进程启动的时候会使用不同的端口,本例使用的是端口。为了让两个GPU实例可以通过这些端口通讯,需要设置两个GPU实例所使用的安全组,开放24的入站访问。在TensorFlow的源代码目录中有个分布式样例文件叫:./tensorflow/tools/dist_test/python/mnist_replica.py,是已经写好的分布式代码。该Python程序通过--pshosts指定参数服务的IP和端口,通过--workerhosts指定工作进程的IP地址和端口。本例中使用的两台GPU实例的ip地址分布是172.31.24.117和172.31.30.43,我在172.31.24.117上运行参数服务器进程,命令如下:python ./tensorflow/tools/dist_test/python/mnist_replica.py --ps_hosts=172.31.24.117:2222 --worker_hosts=172.31.24.117:.30.43:2223 --job_name=ps --task_index=0 注意这里的参数--job_name=ps用于指定本进程的角色。接着在172.31.24.117上起第一个worker进程,命令如下:python ./tensorflow/tools/dist_test/python/mnist_replica.py --ps_hosts=172.31.24.117:2222 --worker_hosts=172.31.24.117:.30.43:2223 --job_name=worker --task_index=0 这个命令和第一个启动参数服务器的命令几乎一样,差别就是--job_name=worker这个参数。接着在172.31.30.43上启动第二个worker进程,命令如下:python ./tensorflow/tools/dist_test/python/mnist_replica.py --ps_hosts=172.31.24.117:2222 --worker_hosts=172.31.24.117:.30.43:2223 --job_name=worker --task_index=1因为都是启动worker进程,所以两个启动worker进程的命令都是用的 --jobname=worker 参数,关键在于第一个worker进程使用taskindex=0 参数,而第二个worker进程使用task_index=1 参数。执行以上命令后稍等片刻两个worker进程就会开始mnist数据集的训练,从日志输出上可以看出两个worker进程分别负责了部分样本的训练。结语以上就是AWS上编译安装TensorFlow并执行分布式训练的过程,完成以上环境搭建以后就可以开始你自己的分布式神经网络训练了。点击“阅读原文”了解更多AWS官方Blog内容AWS(awschina)
大咖专栏 | 如何在AWS上安装使用分布式TensorFlow
央视网消息(新闻联播):七集政论专题片《不忘初心 继续前进》正在中央电视台、央视新闻移动网等融媒体同步播出,这部政论专题片以习近平总书记的思想脉络和行动足迹为主...
【原标题】男子违法收藏枪支被法办 家里好似一个小型弹药库只因其爱收藏—来源:光明网生活频道—编辑:王诗奕 男子违法收藏枪支被法办 家里好似一个小型弹药库只因其爱收藏 ...
本文内容原始标题:考眼力!达州一小学一个班有4对“孪生子” 一个班上有一对双胞胎不稀奇,但一个班上有四对“孪生子”却不多见——达州市通川区第七小学校三年级七班,就...
??? 灵 魂 发 问 8 天长假终于结束 9大长假症候群 ▼ 国庆中秋假期过去了 你要开始上班了 感觉自己“生...
亲爱的朋友们 欢迎来到《双语大课堂》 快来一起进入 今天的学习吧 对《双语大课堂》有什么好的建议 欢迎大家踊跃留言哟 公里妹会认真参考呢~ 想要第一时间看到最新的双语大...
【原标题】八旬老人自带午饭摘辣椒 辛苦了一上午只赚了5块钱—来源:河南在线—编辑:王菲菲 八旬老人自带午饭摘辣椒 辛苦了一上午只赚了5块钱 每到秋季,河南省内黄县的田地...
亲爱的朋友们 欢迎来到《双语大课堂》 快来一起进入 今天的学习吧 对《双语大课堂》有什么好的建议 欢迎大家踊跃留言哟 公里妹会认真参考呢~ 想要第一时间看到最新的双语大...
川大校长谢和平(中)与首届书法专业10名毕业生合影 怎么招? 来自:北京联盟 主要还是针对山东、河南、江苏等书法大省进行自主招生,因为书法学习要求一定的...
来自:北京联盟 【砥砺奋进的五年?我们的获得感】 光明日报采访人员 刘博超 教育兴则国兴,教育强则国强。人民期盼有更好的教育,十八大以来,我国在学前教育...
【原标题】玻璃栈道碎裂特效吓坏游客 景区回应称并不用担心每天都有检测—来源:新华网生活—编辑:王诗奕 玻璃栈道碎裂特效吓坏游客 景区回应称并不用担心每天都有检测 国庆...
大家正在看。。。
免责声明:本站文章除注明来源“北京联盟”外的文章均来自网络和网友投稿,著作权归原作者所有。北京联盟不承担任何连带责任!利用Docker和阿里云容器服务轻松搭建分布式TensorFlow训练集群(上)
本文是该系列中的第五篇文章, 将为您介绍如何在本机以及HPC和阿里云容器服务上快速部署和使用分布式TensorFlow训练集群。
本系列将利用Docker技术在阿里云HPC和容器服务上,帮助您上手TensorFlow的机器学习方案
第五篇:轻松搭建分布式TensorFlow训练集群(上)
本文是该系列中的第五篇文章, 将为您介绍如何在本机以及HPC和阿里云容器服务上快速部署和使用分布式TensorFlow训练集群。
由于在现实世界里,单机训练大型神经网络的速度非常缓慢,这就需要运行分布式TensorFlow集群并行化的训练模型。
分布式TensorFlow集群由两种类型的服务器组成,一种是参数服务器,一种是计算服务器,它们通过高性能的gRPC库作为底层技术互相通信。参数服务器负责管理并保存神经网络参数的取值;计算服务器负责计算参数的梯度。并行训练中的更新模式有两种:同步更新和异步更新, 在同步更新模式下,所有服务器都会统一读取参数的取值,计算参数梯度,最后统一更新。而在异步更新模式下,不同服务器会自己读取参数,计算梯度并更新参数,而不需要与其他服务器同步。启动分布式深度学习模型训练任务也有两种模式:图内拷贝模式(In-graph Replication)和图间拷贝模式模式(Between-graph replication)。
但是TensorFlow本身只是计算框架,要将其应用在生产环境,还是需要集群管理工具的资源调度,监控以及生命周期管理等能力。
在介绍了如何在Kubernetes上部署和使用TensorFlow集群,而本文将为介绍如何在阿里云容器服务上玩转TensorFlow训练集群。
由于分布式TensorFlow比较复杂,我们会分为3个例子向您介绍:
图内拷贝模式(In-graph Replication)
图间拷贝模式模式(Between-graph replication)
基于Host网络的图间拷贝(Between-graph replication)
本文首先介绍的是图内拷贝模式,另外两种将在后面介绍
图内拷贝模式(In-graph Replication)
在In-graph Replication模式中,指整个集群由一个客户端来构建图,并且由这个客户端来提交图到集群中,worker只负责处理梯度计算的任务。In-graph的好处在于解耦了TensorFlow集群和训练应用之间的关系,这样就可以提前创建参数服务器和计算服务器,而这些角色本身无需额外的训练逻辑,只要通过join()方法等待。真正的训练逻辑只需要置于客户端应用里,有足够的灵活性。
但是对于机器学习的多数场景来说,海量数据是非常普遍的;而这个时候,只有一个客户端应用能提交数据和任务的弊端就体现出来了,客户端程序会变成整个训练过程的瓶颈。下篇文章会介绍的图间拷贝(Between-graph replication)就显得尤为重要了,它是TensorFlow分布式学习更为常用的模式。
使用docker-compose模板在本机上部署TensorFlow集群
1. 可以根据创建TensorFlow grpc server的镜像, 它使用的python脚本也在同一目录中
-/denverdino/tensorflow:0.12.0
RUN mkdir -p /var/worker
ADD . /var/worker
RUN chmod 777 /var/worker/*
ENTRYPOINT ["/var/worker/grpc_tensorflow_server.py"]
当然也可以直接使用<-/tensorflow-samples/tf_grpc_server:0.12.0
2. 创建如下的docker compose模板
version: '2'
image: -/tensorflow-samples/tf_grpc_server:0.12.0
container_name: tf-worker0
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=worker
- --task_id=0
image: -/tensorflow-samples/tf_grpc_server:0.12.0
container_name: tf-worker1
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=worker
- --task_id=1
image: -/tensorflow-samples/tf_grpc_server:0.12.0
container_name: tf-ps0
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=ps
- --task_id=0
3. 利用docker-compose命令启动并查看容器状态
& docker-compose up -d
Creating network "distributed_default" with the default driver
Pulling worker-1 (-/tensorflow-samples/tf_grpc_server:0.12.0)...
0.12.0: Pulling from tensorflow-samples/tf_grpc_server
Digest: sha256:6bcd1b142c2cca4cb33a4f8d4f31cb5e8bcefc132d8cb29
Status: Downloaded newer image for -/tensorflow-samples/tf_grpc_server:0.12.0
Creating tf-worker1
Creating tf-worker0
Creating tf-ps0
& docker-compose ps
-----------------------------------------------------------------
/var/worker/gr
pc_tensorflo
tf-worker0
/var/worker/gr
pc_tensorflo
tf-worker1
/var/worker/gr
pc_tensorflo
4. 启动客户端
通过docker exec进入tf-ps0容器,在tf-ps0容器访问tf-worker0容器内的grpc server
& docker exec -it tf-ps0 /bin/bash
& cat client.py
import tensorflow as tf
c = tf.constant("Hello distributed TensorFlow!")
with tf.Session("grpc://tf-worker0:2222") as sess:
print(sess.run(c))
& python client.py
Hello distributed TensorFlow!
可以看到我们能够成功的调用grpc://tf-worker0:2222, 并且输出了结果。
利用阿里云HPC和容器服务,部署TensorFlow集群服务端
1. 购买北京HPC后,按照的文档在HPC机器上部署容器服务。
2. 当安装完成后,确认容器服务上支持了GPU,可以看到每台阿里云HPC上有两个GPU,其中还有每个GPU的配置
3. 为了简化部署,我们提供了一个预先构建基于GPU的TensorFlow grpc server的镜像
-/tensorflow-samples/tf_grpc_server:0.12.0-devel-gpu
-/denverdino/tensorflow:0.12.0-devel-gpu
RUN mkdir -p /var/worker
ADD . /var/worker
RUN chmod 777 /var/worker/*
ENTRYPOINT ["/var/worker/grpc_tensorflow_server.py"]
4. 用如下的docker-compose模板部署到HPC和阿里云容器服务上, 就创建了两个worker和一个PS(参数服务器)
version: '2'
image: -/tensorflow-samples/tf_grpc_server:0.12.0-devel-gpu
container_name: tf-worker0
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=worker
- --task_id=0
- aliyun.gpu=1
- com.docker.swarm.reschedule-policies=["on-node-failure"]
image: -/tensorflow-samples/tf_grpc_server:0.12.0-devel-gpu
container_name: tf-worker1
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=worker
- --task_id=1
- aliyun.gpu=1
- com.docker.swarm.reschedule-policies=["on-node-failure"]
image: -/tensorflow-samples/tf_grpc_server:0.12.0-devel-gpu
container_name: tf-ps0
- --cluster_spec=worker|tf-worker0:2222;tf-worker1:2222,ps|tf-ps0:2222
- --job_name=ps
- --task_id=0
- com.docker.swarm.reschedule-policies=["on-node-failure"]
aliyun.gpu指定申请的GPU个数。阿里云容器服务负责分配GPU给容器,并且将主机上的GPU卡映射到容器内,这里同时会做到对用户透明。举例来说,如果用户申请一个GPU,而主机上只有/dev/nvidia1可用,将主机上的/dev/nvidia1映射为容器里的/dev/nvidia0,这样就会让用户程序与具体设备号解耦。
由于ps-0是参数服务器,并不消耗大量的计算资源无需使用gpu
container_name 用于指定容器的主机名, 例如worker-0的主机名为tf-worker0, ps-0的主机名为tf-ps0, 指定其的目的是用于服务发现
可以通过reschedule-policies可以满足当宿主机节点失败时自动重新调度容器到新的节点
5. 几分钟之后编排模板部署完毕,可以看到worker-0,worker-1和ps对应的容器启动了。注意:worker-0和worker-1运行在同一个HPC宿主机上。
6. 登录到HPC机器可以发现两个容器分别绑定了两块GPU卡
& docker inspect tf-worker0 |grep '"Pid"'
"Pid": 48968,
& docker inspect tf-worker1 |grep '"Pid"'
"Pid": 49109,
& nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.48
Driver Version: 367.48
|-------------------------------+----------------------+----------------------+
Persistence-M| Bus-Id
Disp.A | Volatile Uncorr. ECC |
Pwr:Usage/Cap|
Memory-Usage | GPU-Util
Compute M. |
|===============================+======================+======================|
61W / 250W |
10876MiB / 11443MiB |
+-------------------------------+----------------------+----------------------+
62W / 250W |
10876MiB / 11443MiB |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:
GPU Memory |
Process name
|=============================================================================|
/usr/bin/python
10874MiB |
/usr/bin/python
10874MiB |
+-----------------------------------------------------------------------------+
7. 但是在tf-worker0的容器中以为自己绑定了第一块GPU卡
8. 同时在tf-worker1的容器中也以为自己绑定了第一块GPU卡
9. 这样我们就获得了一个好处:底层基础架构对于应用是透明的,让用户程序与具体设备号解耦。
利用阿里云HPC和容器服务,运行TensorFlow客户端
1. 以下为Client的代码,要做的就是构造写线性数据,其中斜率是2、截距是10,如果梯度下降算法正确的话最终w和b的输出应该也接近2和10。同时我们这里可看到我们将可变参数tf.Variable w和b绑定到ps-0,并且把不同的operation分配给了不同worker,最后将session指向其中一个worker的grpc的终端。
import tensorflow as tf
import numpy as np
train_X = np.linspace(-1, 1, 101)
train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.33 + 10
X = tf.placeholder("float")
Y = tf.placeholder("float")
with tf.device("/job:ps/task:0/cpu:0"):
w = tf.Variable(0.0, name="weight")
b = tf.Variable(0.0, name="reminder")
# tf.initialize_all_variables() no long valid from
if using tensorflow &= 0.12
with tf.device("/job:worker/task:0/gpu:0"):
init_op = tf.global_variables_initializer()
cost_op = tf.square(Y - tf.mul(X, w) - b)
with tf.device("/job:worker/task:1/gpu:0"):
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost_op)
with tf.Session("grpc://tf-worker0:2222") as sess:
sess.run(init_op)
#epoch = 1
for i in range(10):
for (x, y) in zip(train_X, train_Y):
sess.run(train_op, feed_dict={X: x, Y: y})
#print ("Epoch: {}, w: {}, b: {}").format(epoch, sess.run(w), sess.run(b))
#epoch += 1
print ("Result is w: {}, b: {}").format(sess.run(w), sess.run(b))
BTW: 这个程序只是为了演示可以显示的把不同的operation分配到不同的worker上,
2. 我们创建了一个包含上面python脚本的容器镜像
-/tensorflow-samples/distribute_linear_regression:0.12.0
-/denverdino/tensorflow:0.12.0
RUN mkdir -p /var/worker
ADD client.py /var/worker
RUN chmod 777 /var/worker/client.py
CMD ["python", "/var/worker/client.py"]
3. 用如下的docker-compose模板部署到阿里云HPC容器服务上,就可以触发TensorFlow并行训练
version: '2'
aliyun.project_type: "batch"
image: -/tensorflow-samples/distribute_linear_regression:0.12.0
aliyun.remove_containers: "remove-none"
aliyun.project_type: "batch"指定该应用使用的是离线应用,如果希望了解离线计算的元语,可以参考
aliyun.remove_containers 代表容器运行完后是否删除,这里remove-none表示运行完之后不删除
6. 可以到容器服务的应用状态页面查看进度,当发现应用完成后,就可以查看日志
7. 从日志中可以看到拟合出的结果与真实值w=2,b=10非常接近
可以看到,在阿里云容器服务上部署和使用TensorFlow分布式集群非常方便,比如TensorFlow集群的成员是在创建时刻通过cluster_spec指定,容器服务完全兼容Docker网络模型,可以方便地利用容器名进行服务发现。可以说,利用容器服务和Kubernetes在支持分布式TensorFlow训练集群上有异曲同工之妙,也为读者提供了在机器学习的实践中更多的选择。
利用阿里云HPC和容器服务,您除了可以获得高性能计算的洪荒之力,还可以简单的掌控这种能力,实现快速测试、部署机器学习应用,进而加速机器学习产品化的速度。容器服务了提供GPU资源的调度和管理,再加上对象存储,日志、监控等基础设施能力,帮助用户专注于利用机器学习创造商业价值。
最后的最后,要提示您的是:
在阿里云北京HPC上,使用容器服务是完全免费的
想了解更多容器服务内容,请访问
想了解如何在HPC上使用容器服务,请访问
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@ 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
请问一下 这里提到的grpc_tensorflow_server.py这个文件具体的内容是什么
请查看这个项目/cheyang/tensorflow-docker/tree/master/distributed/worker
《轻松搭建分布式TensorFlow训练集群(下)》在哪里?特想知道你对Between-graph replication的解释,尿到一半硬憋回去,好难受!是否可以这么理解,图内拷贝是计算op分布式,把一张完整的图拆分到多个节点。图间拷贝是数据分布式,把数据分片到多个节点。但,如果图间拷贝用多个客户端来提交数据到同一个master节点,这样不行么?还是图内拷贝只能用一个客户端来操作?
/cheyang/tensorflow-docker/tree/master/distributed/worker
这个目录已经不能访问了呢。
提供了高性能可伸缩的容器应用管理服务,支持在一组云服务器上通过Docker容器来进行应用生命周期管理。
提供一种性能卓越、稳定、安全、便捷的计算服务,帮助您快速构建处理能力出色的应用,解放计算给服务带来的压力,使您的...
Loading...}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信