查看原文
其他

大咖专栏 | 分布式神经网络框架 CaffeOnSpark在AWS上的部署过程

2016-06-16 AWS云计算

大咖专栏
大咖专栏是亚马逊AWS官方微信新开设的栏目。本专栏主要刊登亚马逊AWS诸位大咖讲师亲自撰写的Blog,内容涉猎广泛,话题讨论前沿,且与实战紧密相连。我们非常欢迎小伙伴们在评论区留言,与大咖互动交流!
今天为大家撰文的大咖,是亚马逊AWS解决方案架构师——邓明轩老师。
邓明轩亚马逊AWS解决方案架构师拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术挑战,目前在集中精力学习分布式计算环境下的机器学习算法。
1介绍
Caffe 是一个高效的神经网络计算框架,可以充分利用系统的GPU资源进行并行计算,是一个强大的工具, 在图像识别、语音识别、行为分类等不同领域都得到了广泛应用。有关Caffe的更多内容请参考项目主页: http://caffe.berkeleyvision.org/ 不过Caffe的常用部署方式是单机的,这就意昧着它的水平扩展能力受到了限制。使用者可以通过在系统中添加多个GPU的方式提高并发度,不过其并发能力最终受到单系统可支撑的GPU数量的限制。同时,神经网络计算往往又是计算消耗很大的,所以人们在使用Caffe的时候都可能会希望有一种并行计算框架可以支持Caffe。 而我们知道Spark是基于内存的计算框架,基于Yarn, Mesos或者是Standalone模式,它可以充分利用多实例计算资源。因此,如果能够结合Caffe和Spark,Caffe的能力将得到更充分的发挥。 基于这些原因,Yahoo开源的CaffeOnSpark框架受到的极大的关注。 有关CaffeOnSpark的源代码和相关文档,请大家参考: https://github.com/yahoo/CaffeOnSpark 今天我们要进一步讨论的是如何在AWS EC2上部署CaffeOnSpark, 充分利用AWS服务提供的GPU实例构建强大的分布式神经网络计算框架。 在CaffeOnSpark的文档中有明确指出EC2上部署CaffeOnSpark的步骤,具体请参考: https://github.com/yahoo/CaffeOnSpark/wiki/GetStarted_EC2 但是文档的一些部分写得比较简单,初步接触的读者可能在执行过程中遇到一些问题,所以在这里将我个人的安装配置过程整理了一下供大家参考。 安装过程大概可以分为四部分:
a.) 准备好AWS账号 b.) 准备EC2 key pair c.) 准备好一台EC2作为工作机并执行安装命令。 d.) 校验安装成功与否
下面会在“环境准备”一节中具体描述这几个步骤的细节。
2环境准备
首先我们打开文档https://github.com/yahoo/CaffeOnSpark/wiki/GetStarted_EC2,看看文档中刚开始的部分对于环境准备的要求。 里面首先提到我们需要准备“EC2 Key pair”, 就是要准备EC2启动需要的密钥对。当然,为了创建“EC2 Key pair”,为了启动EC2,你首先需要一个AWS账号。有关AWS账号的申请和基本使用这里就不细述了,请参考其它相关文档。需要注意的是你拿到的AWS账号需要有基本的权限才能完成CaffeOnSpark的安装工作,其中包括创建EC2实例,创建安全组等。 “EC2 Key pair”是你在创建EC2实例时创建的密钥对,创建过程中你有一次机会下载私钥文件,就是文中提到的pem文件。如果你之前没有创建过EC2,你也可以直接在EC2控制台的“网络与安全->密钥对”界面中点击“创建密钥对”按钮进行创建。同样,创建过程中你有一次机会下载pem文件,下载后注意保管好该文件,后面都会依赖这个文件。 按文档的描述,有了以上的资源以后就可以执行以下命令:
export AMI_IMAGE=ami-5ff7782c export EC2_REGION=eu-west-1 export EC2_ZONE=eu-west-1c export SPARK_WORKER_INSTANCES=2export EC2_INSTANCE_TYPE=g2.2xlarge#export EC2_INSTANCE_TYPE=g2.8xlarge export EC2_MAX_PRICE=0.8${SPARK_HOME}/ec2/spark-ec2 --key-pair=${EC2_KEY} \    --identity-file=${EC2_PEM_FILE} \    --region=${EC2_REGION} --zone=${EC2_ZONE} \    --ebs-vol-size=50 \    --instance-type=${EC2_INSTANCE_TYPE} \    --master-instance-type=m4.xlarge \    --ami=${AMI_IMAGE}  -s ${SPARK_WORKER_INSTANCES} \    --spot-price ${EC2_MAX_PRICE} \    --copy-aws-credentials \    --hadoop-major-version=yarn --spark-version 1.6.0 \    --no-ganglia \    --user-data ${CAFFE_ON_SPARK}/scripts/ec2-cloud-config.txt \ launch CaffeOnSparkDemo
为了准备环境,我们需要先理解一下上面的脚本。脚本的刚开始部分是一系列变量的定义,我们先了解这些变量的作用。 第一句比较简单,从变量名可以知道这是指定了要使用的AMI的ID:
export AMI_IMAGE=ami-5ff7782c
这个镜像是一个已经安装好Spark、CaffeOnSpark,并加载了常用神经网络测试数据的Ubuntu镜像。该镜像由CaffeOnSpark团队提供,已经共享给所有AWS账号。 不过稍有AWS使用经验的同学会意识到,这样的命令是针对特定的区域(Region)的,因为同一个AMI镜像拷贝到不同AWS区域时它们的AMI ID是不一样的。在命令行中如果指定了一个AMI的ID,就意味着这些命令只能在特定的AWS区域正常工作。 所以我们需要继续查看后续命令,看看哪里指定了区域。幸运的是,命令的第二行就是指定区域的命令:
export EC2_REGION=eu-west-1
我们知道区域代码“eu-west-1”指的是欧洲(爱尔兰)区域,意味着我们运行完这个样例后我们的CaffeOnSpark群集是运行在欧洲(爱尔兰)区域的。因为EC2 key pair也是按区域分的,所以我们创建的 EC2 key pair也应该是在欧洲(爱尔兰)区域。 为了在欧洲(爱尔兰)区域创建你的EC2 key pair,你可以点击AWS控制台右上角的区域选择框,选择欧洲(爱尔兰)区域,然后再按步骤进入EC2的控制台创建EC2 key pair。
同时,你也可以去EC2控制台的“映像->AMI"界面查找镜像ID为ami-5ff7782c的镜像,记得查看时选择“映像类型”为“公有映像”,而不是“我拥有的”。找到这个镜像你还可以仔细查看一下其它相关信息。 如果你发现镜像列表中没有ID为ami-5ff7782c的镜像,有可能你阅读本文的时候相关方已经更新了新的镜像,你可以去CaffeOnSpark的主页https://github.com/yahoo/CaffeOnSpark 找到更新版本的指导,获得新的镜像ID。 进一步往下看可以看到指定AZ的命令行:
export EC2_ZONE=eu-west-1c
其中eu-west-1c代表c可用区,有关可用区的相关概念在这里也不细述了,对可用区(AZ)概念有疑惑的同学请参考其它AWS基础文档。 再往下是指定worker数量的命令:
export SPARK_WORKER_INSTANCES=2
表示这个群集需要两个工作实例,需要注意的是创建的Spark群集中有一个主实例,多个工作实例,其中主实例会使用一般的实例类型,而工作实例会使用GPU实例。这里的参数就表示希望启动两个GPU实例作为工作实例。 我们知道,AWS上的GPU实例也有类型之分,现在可以使用的GPU类型有g2.2xlarge和g2.8xlarge两种,到底工作实例会使用什么GPU类型昵,下面的参数就是为了指定工作实例的实例类型。可以选择g2.2xlarge或者是g2.8xlarge。注意下面两行中第二行被注释掉了,表示只有第一句生效,就是使用g2.2xlarge实例类型。
export EC2_INSTANCE_TYPE=g2.2xlarge#export EC2_INSTANCE_TYPE=g2.8xlarge
接着是指定竞价实例的最高价格,有关竞价实例的细节请参考AWS相关文档,使用竞价实例大概就是设定一个可以接受的价格去参加实例拍卖的竞价,如果你的出价比别人高你就可以拍得实例。下面这句就是设置竞价为0.8美金每小时:
export EC2_MAX_PRICE=0.8
后面我们继续分析命令会知道,后续执行命令的时候会使用下面的参数,表示希望使用竞价实例作为工作实例。但是这不是CaffeOnSpark所必须的,如果你不希望使用竞价实例,可以不使用以下参数,这样就可以使用“按需实例(OnDemand)”了。
--spot-price ${EC2_MAX_PRICE}
接着就是运行真正的命令了,运行的命令是:
${SPARK_HOME}/ec2/spark-ec2
后面带有许多参数,在具体了解不同参数的作用前,我们先得思考,这个spark-ec2命令从哪里来?如果你之前曾经安装过Spark,在你的Spark主目录里就可以找到ec2目录,里面有spark-ec2命令。 我自己的环境中曾经安装过Spark 1.5,所以也可以找到这个ec2/spark-ec2命令,不过如果我尝试去执行这里的这些命令的话会报错,报“不可知的Spark版本”错误。原因是这里的脚本指定目标Spark是1.6.0,但是我们运行的Spark是 1.5,所以会报错。所以我重新启动了一个新的实例安装了Spark 1.6,以执行spark-ec2命令。有关Spark 1.6的安装,下面的章节会有介绍部分安装过程,现在我们先看看这里spark-ec2命令的不同参数有什么: 其中--key-pair和--identity-file是用来指定EC2 key pair的,就是EC2要使用的密钥,--key-pair用于指定密钥的名称,--identity-file用于指定密钥的pem文件的路径:
--key-pair=${EC2_KEY} \--identity-file=${EC2_PEM_FILE}\
接着 --ebs-vol-size是用于指定EBS卷大小的,这里设置了50G,因为镜像大小的原因,你不能把--ebs-vol- size设置的太小,这里就是用样例中的50G吧:
--ebs-vol-size=50 \
接着是通过--instance-type指定工作实例的实例类型,这里是用了前面定义的变量,按前面我们变量的定义,下面的参数会是用g2.2xlarge作为工作实例的实例类型:
--instance-type=${EC2_INSTANCE_TYPE} \
接着是通过--master-instance-type参数指定群集主实例的类型,因为主实例不参与神经网络计算,所以主实例可以不用选择GPU实例,这里是用了m4.xlarge:
--master-instance-type=m4.xlarge \
然后是用--ami参数指定实例创建时是用的镜像ID:
--ami=${AMI_IMAGE} \
-s参数用于指定工作实例的数量,这里引用了之前定义的参数 SPARK_WORKER_INSTANCES ,我们把它设置成2,就是会启动两个工作实例:
-s ${SPARK_WORKER_INSTANCES} \
--spot-price就是前面提到的是用竞价实例的参数,如果你不希望是用竞价实例,直接删除这个参数就好了:
--spot-price ${EC2_MAX_PRICE} \
--copy-aws-credentials用于指定是否拷贝AWS授权证书,这里不用细究它的作用:
--copy-aws-credentials \
--hadoop-major-version=yarn 和 --spark-version用于指定Hadoop的运行框架信息和Spark的版本:
--hadoop-major-version=yarn --spark-version 1.6.0 \
--no-ganglia  表示不需要是用ganglia
--no-ganglia \
--user-data用于指定实例启动时的需要完成的动作,这个参数非常重要,CaffeOnSpark安装过程中的很多设置都是因为设置了这个“User-Data”才完成的。这里设置的user-data指向CaffeOnSpark目录的scripts子目录中的 ec2-cloud-config.txt 。这就意味着我们在使用这个命令的时候应该已经拥有CaffeOnSpark的代码了,具体的获取方法在下一节中有详细描述:
--user-data ${CAFFE_ON_SPARK}/scripts/ec2-cloud-config.txt \
最后就是真正“启动”的参数了,这里同时指定了群集的名称,本例为“CaffeOnSparkDemo”,注意,这个群集需要是区域内唯一的,如果你希望进行多次测试,测试之前不会有干扰,每次启动时需要在这里设置不同的群集名称:
launch CaffeOnSparkDemo
理解了整个命令,我们再次总结一下我们需要完成的工作:
a.) 准备好AWS账号,登录到欧洲(爱尔兰)区域 b.) 准备EC2 key pair,记录下key pair名称,保管好pem文件 c.) 准备好一台EC2作为工作机,在上面下载CaffeOnSpark的源码,安装Spark 1.6,并在这台机器上最终执行spark-ec2命令。 d.) 校验安装成功与否
我们假设你已经做好了a、b两步,下一节会详细讲解步骤c,紧接着第四节会讲解步骤d:测试校验过程。
后续内容,我们在下一条微信中为您呈现


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存