利用 Amazon ECS 进行分布式机器学习

70ea7b1d80d333f75c525ab7d1388d76.gif

本文作者 

Santiago Flores Kanter 亚马逊云科技高级解决方案架构师

Ravi Yadav 亚马逊云科技首席容器专家

校译作者

梁宇 亚马逊云科技专业服务团队 DevOps 顾问

在 Amazon ECS 服务上运行分布式机器学习工作负载可让 ML 团队更加专注于创建、训练和部署模型,而不是花时间去管理容器编排引擎。凭借着简单的架构、控制节点的无感升级以及集成了原生的 Amazon IAM 认证服务,Amazon ECS 为运行 ML 项目提供了一个绝佳的环境。此外,Amazon ECS 还支持使用英伟达的 GPU 以及提供预装英伟达内核驱动程序和 Docker 运行时的优化镜像。

通常在使用分布式方法进行模型训练的时候,有两种资源部署方式可供选择。一种是使用包含多个 GPU 的单节点实例,另一种则是多节点实例,每一个实例包含一个或多个 GPU 。除资源以外,相对应的还有几种技术支持实现分布式模型训练。它们分别是流水线并行(模型的不同层分别被加载到不同的 GPU 中)、张量并行(将单层分割到不同的 GPU 中)以及分布式数据并行(每一个 GPU 中都会加载模型的完整副本,训练数据会被分割以及并行处理)。

本文旨在展示利用 PyTorch 和 RayTrain 这两个库在 Amazon ECS 运行的容器中实现分布式数据并行的机器学习模型训练。通过深入研究本文的实现,读者可以获得一个可用的示例并由此开启分布式机器学习的旅程。与此同时,读者也可将本文的实现作为基础样例,并根据具体情况的模型、数据以及用例进行定制化。

解决方案概述

本解决方案由一个 ECS 集群组成,该集群上运行的是 Ray 集群。Ray 集群是由一组 worker 进程以及一个 Ray head 进程组成,所有的 worker 进程都连接到这个 head 进程。因此,我们将会在 ECS 集群中部署两种服务:Ray head 以及 Ray worker。我们将使用单个 ECS task 来运行 Ray head 服务,而对于 Ray worker 服务,为了展示多节点的场景,我们将使用两个 ECS task 来运行。这里所有的 task 都只包含一个 container。Amazon S3 将用作这些 task 之间的共享存储。

4577e9cfe8d8bc99097cad81b85c20d8.png

先决条件

读者在演练前需作如下准备:

  • 一个亚马逊云科技帐号

  • Terraform 命令行工具

  • 安装了 session manager 插件的 Amazon CLI

  • 亚马逊云科技帐号里的 G 类型实例的按需配额需要大于等于 8(本次方案将使用两个大小为 g5.xlarge 的节点)

  • Amazon ECS

  • Amazon S3

  • PyTorch

  • Ray Train

演练

本次演练中,我们将创建一个 S3 桶作为共享存储。然后,我们在 ECS 集群中创建两个自动扩缩容的组(ASG),其中一个组配置大小为 m5.large 的实例,用于部署 Ray head服务;另一个组配置大小为 g5.xlarge 的实例(每一个实例都有 A10 GPU),用于部署 Ray worker 服务。基础架构准备完成之后,我们将使用 FashionMNIST 数据集对 resnet18 模型进行分布式训练。由于该模型可以在单个 GPU 中完整加载,因此我们将采取分布式数据并行的方法来训练。

部署基础设施

在继续进行演练之前,请先考虑以下几点:

  • 遵循在私有子网运行此类工作负载的最佳实践。由于下载数据集需要连接互联网,因此我们创建了一个 NAT 网关和一个 Internet 网关。

  • 使用了单个子网来改善延迟,从而令所有实例都在同一可用区(AZ)中启动。同时,这也避免了可用区之间数据传输的花费。

  • 工作节点使用了一种集群置放策略。这种策略可使其中运行的工作负载享有低延迟的网络性能。

  • Amazon ECS 不支持 Ray autoscaling。但是,可以通过配置 Amazon ECS 的服务自动扩展来对 ECS task 数进行增加或减少,从而实现相同的效果。

  • 在分布式训练模型训练中,对每个工作节点配备更多的 GPU 意味着更好的性能。例如,您的模型训练任务需要 8 个 GPU,那么通常来说,使用 1 个带有 8 个 GPU 的实例进行训练,在性能方面要比使用 8 个各自带有 1 个 GPU 的实例集要好。对于容器来说也是如此,1 个容器享有 8 个 GPU 的性能比 8 个容器各自享有 1 个 GPU 的性能要好。这是由于运行训练任务的集群中每个节点都需要额外的开销。为了降低实验成本,本次演练使用 g5.xlarge(每个实例只有一个 GPU)。

步骤

1. 克隆 ecs-blueprints 代码库

git clone https://github.com/aws-ia/ecs-blueprints.git

2. 部署基础设施

cd ./ecs-blueprints/terraform/ec2-examples/core-infra 
terraform init 
terraform apply -target=module.vpc \ -target=aws_service_discovery_private_dns_namespace.this

3. 部署 distributed ML training blueprint

cd ../distributed-ml-training 
terraform init 
terraform apply

代码执行完成之后在输出中查找并记录下 S3 桶的名字,下一部分内容会用到。

运行训练任务

基础设施创建完成后,我们就可以运行分布式训练的脚本了。为了简单起见,我们连接到一个容器中并在里面直接运行该脚本。当然,使用 Amazon SageMaker 的 Notebooks 或者 Amazon Cloud9 会获得更好的用户体验。

1. 连接到运行 Ray head 服务的 EC2 节点。

HEAD_INSTANCE_ID=$(aws ec2 describe-instances \ --filters 'Name=tag:Name,Values=ecs-demo-distributed-ml-training-head' 'Name=instance-state-name,Values=running' \ --query 'Reservations[*].Instances[0].InstanceId' --output text --region us-west-2 ) aws ssm start-session --target $HEAD_INSTANCE_ID --region us-west-2

2. 在该 EC2 节点查找容器 ID 并启动一个交互式 Shell。这可让我们在容器里面执行相关的命令(如果容器的状态不正常的话,以下命令有可能会报错,多尝试几次即可)。

CONTAINER_ID=$(sudo docker ps -qf "name=.*-rayhead-.*") sudo docker exec -it $CONTAINER_ID bash

3. 检查 Ray 集群的状态。

ray status

输出示例:

(...)
Node status
---------------------------------------------------------------
Healthy:
 1 node_a3d74b6d5089c52f9848c1529349ba5c4966edaa633374b0566c7d69
 1 node_a5a1aa596068c73e17e029ca221bfad7a7b0085a0273da3c7ad86096
 1 node_3ae0c0cabb682158fef418bbabdf2ea63820e8b68e4ae2f4b24c8e66
Pending:
 (no pending nodes)
Recent failures:
 (no failures)
(...)
Resources
---------------------------------------------------------------
Usage:
 0.0/6.0 CPU
 0.0/2.0 GPU
 0B/38.00GiB memory
 0B/11.87GiB object_store_memory
Demands:
 (no resource demands)

如果您没有看到 2.0 GPU,那么有可能是 Ray worker 服务还没有启动完毕。只需要稍等几分钟让 Ray worker 服务启动并自动加入到集群即可。

4. 将前面记录的 S3 桶的名字作为参数传递给分布式训练脚本并执行该脚本。

export RAY_DEDUP_LOGS=0 # Makes the logs verbose per each process in the training 
cd /tmp 
wget https://raw.githubusercontent.com/aws-ia/ecs-blueprints/main/terraform/ec2-examples/distributed-ml-training/training_example.py 
python training_example.py REPLACE_WITH_YOUR_BUCKET_NAME

输出示例:

(...)
Wrapping provided model in DistributedDataParallel.
(...)


(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 0 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.660568237304688]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 0 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.65453052520752]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 1 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.172431230545044]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 1 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.17476797103882]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 2 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 16.807305574417114]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 2 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 16.807661056518555]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 3 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.16184115409851]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 3 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.164414882659912]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 4 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.43423628807068]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 4 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.430140495300293]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 5 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.319995880126953]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 5 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.331279277801514]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 6 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.402108669281006]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 6 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.385886192321777]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 7 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 16.865890741348267]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 7 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 16.86034846305847]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 8 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.0880389213562]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 8 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.094018697738647]
(RayTrainWorker pid=234, ip=10.0.15.42) [Epoch 9 | GPU0: Process rank 1 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.191094160079956]
(RayTrainWorker pid=227, ip=10.0.2.255) [Epoch 9 | GPU0: Process rank 0 | Batchsize: 128 | Steps: 235 | Total epoch time: 17.189364910125732]


(..)
╭───────────────────────────────╮
│ Training result               │
├───────────────────────────────┤
│ checkpoint_dir_name           │
│ time_this_iter_s      182.976 │
│ time_total_s          182.976 │
│ training_iteration          1 │
│ accuracy               0.8852 │
│ loss                  0.41928 │
╰───────────────────────────────╯


(...) Total running time: 3min 7s


Result(
  metrics={'loss': 0.4192830347106792, 'accuracy': 0.8852},
  (...)
)

上述日志展示了:

  • GPU ID 表示的是 GPU 序号。这里只有 GPU 0 是因为每一个实例只配备了一个 GPU。

  • Process rank 是全局唯一的,这里只有 0 或者 1 是因为我们一共只有两个 GPU。

  • Epoch number 是从 0 到 9。

  • Batch size 是指每次迭代所使用的训练数据示例的数量。

  • Steps 指的是多整个数据集完成一次遍历所需要的循环次数。在本例子中是 235。但是这个数字从何而来?FashionMNIST 数据集有 60,000 个示例。如果 batch size 是 128 的话,我们需要在每个 epoch 执行 469 个 steps 才能遍历整个数据集(60,000/128)。然而,我们总共只有 2 个 GPU,那么 469 个 steps 要平均分配到每个 GPU 上,即 469/2,所以得到我们在日志里面看到的 235 个 steps 。

清理资源

为了避免产生额外费用,请记住清理之前使用 Terraform 创建的所有资源。

1. 删除 distributed ML training blueprint

terraform destroy

2. 删除基础设施

cd ../core-infra
terraform destroy

总结

在本文中,我们使用了 Amazon ECS 来运行分布式数据并行的模型训练。我们从基础设施的构建开始,包括 ECS 集群,容量提供程序,任务定义和服务部署。然后,我们使用了 FashionMNIST 数据集对 resnet18 模型进行训练,同时通过 Ray Train 和 PyTorch 库将训练的工作负载分布在多个 GPU 中。与使用单个 GPU 相比,使用分布式方法能让我们更快地完成模型训练。

在开启您的分布式训练之旅前,请务必查看 Amazon ECS GPU 的文档,了解更多 Amazon ECS 支持的不同配置和其他功能的相关信息:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-gpu.html

  • 原文链接:

    https://aws.amazon.com/blogs/containers/distributed-machine-learning-with-amazon-ecs/

点击阅读原文查看博客,获得更详细内容!

本篇作者

374d429bb820b9cb29d9f6d581aaffe3.jpeg

Santiago Flores Kanter

亚马逊云科技高级解决方案架构师,专门从事容器、机器学习和无服务器领域,为数字原生客户提供支持和设计云解决方案。

e27a2ab4192b1c36a73f9f7846063f2d.jpeg

Ravi Yadav

亚马逊云科技首席容器专家,Ravi 领导亚马逊云科技容器服务的上市策略,为 ISV 和数字原生客户提供支持。

dad5aa2512f1e1fcb4fd08d59a6b6856.png

梁宇

亚马逊云科技专业服务团队 DevOps 顾问,主要负责 DevOps 技术实施。尤为热衷云原生服务及其相关技术。在工作之余,他喜欢运动,以及和家人一起旅游。

3a41d01b5dc20f101fc768980764a03b.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

50663979a0e6739e5980f7477f55b016.gif

听说,点完下面4个按钮

就不会碰到bug了!

31b5c51b0be0c28e1c8e5a9ec835d50d.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/554296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建PyTorch神经网络进行气温预测(手写+调包两种方法)(保证学会!)+找到神经网络的最优情况

代码上有注释!!!!!! 本篇主要包括三大部分: 第一部分:导入数据集导入第三方库数据集简单介绍与可视化数据集简单预处理 第二部分:手写神经网络代码实现气温预测&#…

链表传一级指针以及leetcode做题有感

上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针: 之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如图: 从左边到右边,头指针 一级指针plist 的值发…

C++算法题 - 哈希表

目录 383. 赎金信205. 同构字符串290. 单词规律242. 有效的字母异位词49. 字母异位词分组1. 两数之和202. 快乐数219. 存在重复元素Ⅱ128. 最长连续序列 383. 赎金信 LeetCode_link 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 m…

道合顺传感新品上市!高性能氢气传感器DSB14-G3K-J详解

道合顺传感高性能氢气传感器DSB14-G3K-J正式发布!超强抗干扰能力优势明显。应对氢气安全挑战、高性能氢气传感器国产化、为储能保驾护航。 氢气,作为现今能源领域中的新贵,在储能行业中应用广泛且备受瞩目。但氢气易燃、易爆特性使其在生产、…

gradle.properties 中文字符乱码问题

我用AS开发Android应用。在gradle.properties中输入中文,再次打开时,发现中文变成了???。上网查询,发现了一个解决办法: 在菜单File-Settings-Editor-File Encodings中,将“Default…

【复习笔记】FreeRTOS(五)时间片调度

本文是FreeRTOS复习笔记的第五节,时间片调度。 上一篇文章: 【复习笔记】reeRTOS(四) 列表项的插入和删除 文章目录 1.时间片调度简介1.1. 运行过程 二、实验设计三、测试例程四、实验效果 1.时间片调度简介 FreeRTOS支持多个任务同时拥有一个优先级&am…

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日,广东省春藤实业有限公司(以下简称“春藤实业”)SAP S/4HANA Cloud Public Edition(以下简称“SAP ERP公有云”)项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

数仓建模—数据架构

数仓—数据架构 为了在企业决策中使用数据,数据必须经过整个数据平台的各个阶段。整个过程是什么样子的,从开始到结束?原始形式的数据是如何转化为可导致商业决策的见解的?这些问题可以通过数据架构来回答。 数据架构是指记录组织所有数据资产的模型、规则和标准。它映射…

Web前端-JavaScript

黑马程序员JavaWeb开发教程 文章目录 一、js引入方式1、内部脚本2、外部脚本 二、js基础语法1、书写语法(1)基本语法(2)输出语句 2、变量(1)变量(2)注意事项 3、数据类型、运算符、流…

spring-数据处理及跳转

结果跳转方式 ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} viewName {视图解析器后缀} <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.view.InternalResourceViewRes…

Java定时任务

一、java.util.Timer java.util.Timer 类允许您在未来的某个时间执行一个任务&#xff0c;或者在一定的时间间隔执行任务。您可以创建一个 Timer 实例&#xff0c;并调用其 schedule() 方法来安排任务的执行。这种方式比较简单&#xff0c;但在高并发环境下可能不够灵活。 1.…

Git学习与码云实战

Git学习与码云实战 Git安装 概述&#xff1a; Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理&#xff0c;是目前使用范围最广的版本管理工具。 下载安装&#xff1a; 下载地址&#xff1a;https://git-scm.com/ 下载后傻瓜…

李彦宏:开源模型会越来越落后

李彦宏&#xff1a;开源模型会越来越落后 昨天听完的李总讲座 大家以前用开源觉得开源便宜&#xff0c;其实在大模型场景下&#xff0c;开源是最贵的。所以&#xff0c;开源模型会越来越落后。 ——李彦宏 至于开源还是闭源&#xff0c;这和企业的利益息息相关。 随着科技的迅猛…

双向链表详解

一.双向链表结构 我们一般所说的双向链表是带头循环双向链表&#xff0c;这里的带头更我们之前的头节点不是一回事。带头链表里的头节点&#xff0c;实际上为哨兵位&#xff0c;哨兵位的头节点种是不存放任何有效数据的&#xff0c;只是站在这里起到放哨的作用。 哨兵位的意义…

【C++从练气到飞升】08---模板

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 一、泛型编程 什么是泛型编程: 二、函数模板 1. 函数模板概念 2. 函数模板格式 3. 函数模板的原理 4. 函数模板的实例…

Nginx part2.2

目录 如何用Nginx搭建多网址服务器&#xff1f; 基于ip地址的虚拟主机 1. 先建立存储网页的目录 2.进行子配置 3.编写.conf文件 基于端口号的虚拟主机 基于域名的虚拟主机 如何用Nginx搭建多网址服务器&#xff1f; 有些网站&#xff0c;ip不同&#xff0c;域名不同&…

格林兰岛和南极洲的流域边界文件下载

&#xff08;1&#xff09;南极流域系统边界和掩蔽区 下图显示了由戈达德冰面高程小组使用ICESat数据开发的南极分水岭。我们对西南极冰盖&#xff08;系统18-23和1&#xff09;、东南极冰盖&#xff08;系统2-17&#xff09;和南极半岛&#xff08;系统24-27&#xff09;的定…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

LevelDB源码阅读笔记(1、整体架构)

LevelDB源码阅读笔记&#xff08;1、整体架构&#xff09; LeveDB源码笔记系列&#xff1a; LevelDB源码阅读笔记&#xff08;0、下载编译leveldb&#xff09; LevelDB源码阅读笔记&#xff08;1、整体架构&#xff09; 前言 对LevelDB源码的博客&#xff0c;我准备采用总…

ragflow知识库使用案例

参考: https://github.com/infiniflow/ragflow/blob/main/README_zh.md 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据, 网页等。 运行步骤: 1、确保 vm.max_map_count 不小于 262144 【更多】: 如需确认 vm.…
最新文章