在 Amazon Web Services* (AWS) 上分布式训练深度网络

下载文档

Ravi Panchumarthy(英特尔)、Thomas “Elvis” Jones (AWS)、Andres Rodriguez(英特尔)和 Joseph Spisak(英特尔)

深度神经网络具备出色的高级表达功能,并在诸多领域展示了一流的准确性,如计算机视觉、语音识别、自然语言处理以及各种数据分析领域。深度网络需要训练大量的计算,训练时间通常持续数天甚至数周。英特尔正在优化常见的框架,如 Caffe*、TensorFlow* 和 Theano* 等,以显著提升性能,缩短单个节点的训练总时间。此外,英特尔还在添加或增强上述框架的多节点分布式训练功能,以在多个节点间分享计算要求,进一步缩短训练时间。之前训练一个工作负载需要数天时间,现在只需数小时。阅读以了解更多信息

Amazon Web Services* (AWS) 虚拟私有云 (VPC) 提供了支持多节点分布式深度网络训练的绝佳环境。AWS 和英特尔展开合作,致力于创建一套构建集群的简单脚本,支持开发人员利用强大的 AWS,轻松部署并训练深度网络。本文提供了设置 AWS CloudFormation* 环境的具体步骤,以便利用 Caffe 网络训练深度网络。

AWS CloudFormation 设置

按照以下步骤创建一个 VPC,将一个 Elastic Compute Cloud (EC2) t2.micro 实例用作 AWS CloudFormation 集群 (cfncluster) 控制器。接下来,利用这个 cfncluster 控制器在 VPC 中创建一个由主 EC2 实例和若干计算 EC2 实例组成的集群。

部署 Cloudformation 和 cfncluster 的步骤

  1. 使用 AWS 管理控制台启动 AWS CloudFormation (见图 1)。


    图 1.Amazon Web Services 中的 CloudFormation

  2. 单击 Create Stack
  3. 在标记的位置,选择一个模板(见图 2),选择 Specify an Amazon S3 template URL,然后输入 https://s3.amazonaws.com/caffecfncluster/1.0/intelcaffe_cfncluster.template。单击 Next


    图 2.输入模板 URL。

  4. 为堆栈命名,如 myFirstStack。选择一个密钥对,查找您刚刚命名的密钥对(如果您需要创建一个密钥对,请遵照本说明)。保留剩余的参数。单击 Next
  5. 输入一个密钥,如 name,然后输入一个值,如 cfnclustercaffe
    需要指出的是,您可以自主命名密钥和值。名称不需要匹配之前步骤创建的密钥对。
  6. 单击 Next
  7. 检查堆栈,选中确认选框,然后单击 Create。创建堆栈过程可能需要几分钟的时间,请在创建过程中耐心等待,直到 3 个堆栈的状态全部显示为 CREATE_COMPLETE。
  8. 第三步使用的模板调用了其他两个嵌套模板,创建了一个配有 EC2 t2.micro 实例的 VPC(见图 3)。选择配有 EC2 实例的堆栈,然后选择 Resources。单击 cfnclusterMaster 的物理 ID。


    图 3.在 Resources 选项卡中选择物理 ID。

  9. 将转至 AWS EC2 控制台(图 4)。Description 的下面是 VPC ID 和子网 ID,请记下它们,因为会在随后的步骤中用到。右键点击实例,选择 Connect 并按照说明操作。


    图 4.AWS EC2 控制台。

  10. 您通过 ssh 命令进入实例后,需要利用以下命令,修改集群的配置:

    cd .cfncluster
    cp config.edit_this_cfncluster_config config
    vi config

  11. 按照 config 文件中的注释(用第九步的最后一个命令打开)填写适当信息。
    • 从 AWS 系统管理员处获取 AWS_ACCESS_KEY 和 AWS_SECRET_ACCESS_KEY(如果您没有的话)或 按照本步骤获取

    需要指出的是,虽然主节点没有标记为计算节点,却相当于一个计算节点。因此,如果训练过程中使用的节点总数为 32,需要选择一个 queue_size = 31 的计算节点。

    • 使用第八步获取的 VPC ID 和子网 ID。
    • 目前使用的最新版 custom_ami 是 ami-77aa6117;新版 AMI 发布后,将更新本文内容。
  12. 利用以下命令启动集群:cfncluster create
    <vpc_name_choosen_in_config_file>
    .将启动更多的 AWS CloudFormation 模板。您可以通过 AWS 管理控制台中的 AWS CloudFormation 页面查看这些模板。

训练几个常见网络所需的示例脚本

cloud-formation-setup 完成后,如果您将集群的大小配置为 N,将创建 N+1 个实例(1 个主节点和 N 个计算节点)。需要指出的是,主节点也被创建为计算节点。在创建的集群中,全部 N+1 个实例共享一个磁盘。实例包含英特尔 caffe、英特尔® 数学核心函数库(英特尔® MKL)和用于训练 CIFAR-10 和 GoogLeNet 的示例脚本。开始训练示例网络前,请登录主节点。

如欲利用现成的解析器和 train_val prototxt 文件开始训练一个 CIFAR-10 模型,请运行以下命令:

cd ~/scripts/
./aws_ic_mn_run_cifar.sh

开始训练 GoogLeNet 模型前,下载脚本所需的 ImageNet 数据集,并配置变量 path_to_imagenet_train_folderbatchsize_pernode 和其他变量(如需要),并运行 ./aws_ic_mn_run_googlenet.sh 脚本

cd ~/scripts/
#Edit variables path_to_imagenet_train_folder, batchsize_pernode and others if required
vi ./aws_ic_mn_run_googlenet.sh
./aws_ic_mn_run_googlenet.sh

脚本 aws_ic_mn_run_cifar.sh 创建了一个 hosts 文件 (~/hosts.aws),包含了 VPC 中所有实例的 IP 地址。然后更新解析器和位于 ~/models/cifar10/ 中的 train_val prototxt 文件。您可以根据自己的需求修改这些 prototxt 文件。aws_ic_mn_run_cifar.sh 脚本将打开数据服务器,将数据传输至计算节点。由于数据服务器和计算一起运行,将在主节点产生一定的开销。启动数据服务器后,利用 mpirun 命令启动分布式训练。

脚本 aws_ic_mn_run_googlenet.sh 创建了一个 hosts 文件 (~/hosts.aws),包含 VPC 中所有实例的 IP 地址。和 CIFAR-10 示例(由数据服务器提供数据)不同,在 GoogLeNet 训练中,每个 worker 将读取各自的数据。该脚本将基于模板解析器和位于~/models/googlenet/ 的 train_val prototxt,为每个 worker 创建单独的解析器、train_val prototxt 文件和 train.txt 文件。您可以修改这些模板 prototxt 文件,使其满足您的训练需求。aws_ic_mn_run_googlenet.sh 脚本稍后将利用 mpirun 命令启动该任务。

声明

英特尔和 Intel 标识是英特尔在美国和/或其他国家的商标。*其他的名称和品牌可能是其他所有者的资产。©英特尔公司。

英特尔技术的特性和优势取决于系统配置,并需要借助硬件、软件或服务来实现。实际性能会因您使用的具体系统配置的不同而有所差异。任何计算机系统都无法提供绝对的安全性。请联系您的系统制造商或零售商,或访问 intel.cn,了解更多信息。

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。诸如 SYSmark 和 MobileMark 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能,上述任何要素的变动都有可能导致测试结果的变化。请参考其它信息及性能测试(包括结合其它产品使用时的运行性能)以对目标产品进行全面评估。

如欲了解更多信息,请访问 http://www.intel.com/performance

有关编译器优化的更完整信息,请参阅优化通知