亚马逊AWS官方博客
利用 Amazon EC2 P5 Spot 实例进行 LLM 的微调任务
概述
随着生成式 AI 的大力发展,各大公司纷纷在开发自己的生成式 AI 应用,为了优化生成式 AI 的效果,微调是一种常用的方式,但由于高性能 GPU 的紧缺,阻碍了用户的研发速度。
亚马逊 p5.48xlarge 实例类型采用 NVIDIA H100 GPU,具有 8 个 GPU 单元,每个单元包含 80GB 显存,具有优秀的性能,相比上一代亚马逊 p4d 实例(采用 8 个 NVIDIA A100 GPU),加速了 4 倍以上的训练时间,也减少了 40% 的训练成本。
本文将介绍采用 P5 Spot 实例,进行 LLM 的微调任务,对于参数量较少的 LLM,比如 13B 以下,一般可以采用单机多卡的方式,这种场景可容错且比较灵活,适用 Spot 实例。同时与按需实例价格相比 Spot 实例具有巨大的成本优势。
Spot 实例存在的问题是可能被中断回收,影响正常的任务运行。
Spot 实例说明:
- EC2 Spot 实例是利用空闲的 EC2 容量,与按需实例是相同的基础架构。
- 与按需实例价格相比,Spot 实例最高可以节省 90% 的成本,Spot 价格基于 EC2 实例的长期供需趋势逐步调整,无需竞价更易预测。
- Spot 实例和按需实例之间的唯一区别是,当亚马逊 EC2 需要收回 Spot 容量时,Spot 实例可能会中断并提前两分钟发出通知。
- Spot 实例在容量可用时可运行,对于短期运行的应用程序或者可以中断的应用程序,Spot 实例是经济实惠之选。例如,Spot 实例非常适合数据分析、批处理作业、后台处理和机器学习等任务。
- Spot 实例不能保证可以运行足够长的时间以完成工作任务。Spot 实例也不能保证可以立即得到想要的计算容量,或者不能保证始终可以获得请求的总容量。此外,Spot 实例中断和容量的状况可能会随着时间的推移而发生变化,因为 Spot 实例可用性会根据供需关系而发生变化。
亚马逊 EC2 Spot 容量和中断处理最佳实践的根本原则是灵活性,从实例灵活(不同实例家族/代系/Size)、时间灵活、地区灵活(不同可用区/区域)三个方面丰富 Spot 容量池,提高灵活度,降低 Spot 中断率。
在使用 P5 Spot 实例之前,首先在 Service Quotas 中修改 EC2 的 All P5 Spot Instance Requests 参数,提高可启动的 P5 Spot 实例限额。
下面介绍一个参考架构,管理 EC2 P5 Spot 实例,尽可能降低 Spot 容量不足和中断产生的影响。
架构图说明:
- Management System 将接收用户请求,创建和管理 Spot 实例。
- DynamoDB 数据库保存 Spot 实例的状态和用户请求信息。
- Jumpserver 将供用户 SSH 登陆。
- Spot Instance 是 P5 Spot 实例,用户通过 Jumpserver 登陆,进行 LLM 微调的任务。
- S3 保存用户的训练数据,将利用 Mountpoint for Amazon S3 插件,将 S3 桶 mount 到 P5 Spot 实例。用户在使用 P5 Spot 实例时,可以先将 S3 数据拷贝到本地存储,以加速访问数据的速度;也可以将微调任务的结果和日志放到S3桶中,用于长期保存和下载。
- SNS 将通知用户关于实例状态和任务状态的信息,可以通过邮件或调用接口等方式;另外通过 SNS 的 Subscription filter policy 可以过滤接收到的消息,发给指定的接收方。
- EventBridge 可配置 Rule,接收和处理实例状态改变等的事件,比如实例创建、销毁和中断。
- Fault Injection Service 可以模拟 Spot 实例中断,用来测试系统功能。
Management System 可以采用 Serverless 的方式实现,比如利用 Lambda、API Gateway、Step Functions 和 DynamoDB。下面是参考的流程图。
参考架构中涉及到的接口和示例
以下的接口示例采用 AWS CLI 命令行工具完成,其他语言程序开发也可以借鉴 AWS CLI 的命令。
AWS CLI 的安装参考:https://docs.thinkwithwp.com/cli/latest/userguide/getting-started-install.html
下面示例的资源部署在 Ohio Region(us-east-2),为保障命令的顺利执行,可以采用具有 admin 权限的 IAM User。
1. 定义环境变量
修改上面的参数值。
2. 创建 S3 Bucket
3. 创建 SNS Topic
SNS 将通知用户关于实例状态和任务状态的信息,可以通过邮件通知或调用接口等方式。
下面示例将创建 SNS Topic,创建 email 的订阅,在 access policy 中添加 EventBridge 的消息发布权限。
操作命令如下:
邮箱将收到订阅的确认邮件,需确定订阅。
4. 启动 Spot 实例
1)查看 Spot 实例的历史价格:
由于 EC2 P5 Spot 实例在各个区域和可用区的价格是不同的,且相差较大,可以通过该命令获得较低价格的可用区,在保障容量的前提下,优先使用性价比高的区域和可用区。
注:Start Time 参数设定为未来日期时,将返回一条最近的 Spot 实例价格。
2)设定需要的实例数量,查看Spot placement score(SPS)。
详见 SPS 说明:https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/spot-placement-score.html
操作指令:
返回的结果如下:
从命令的返回结果中,可以发现在 3 个区域 us-east-1,us-west-2 和 us-east-2 中有 4 个可用区支持 P5 Spot,其中 use2-az2 可用区的 SPS 相对较高,可优先尝试启动 use2-az2 的 P5 Spot 实例。
Spot 容量会发生波动,所以无法确保始终获得所需的容量。SPS 表示 Spot 请求在某个区域或可用区中获得成功的可能性,分数越高可能性越大。
3)获得 use2-az2 对应的 Subnet
4)创建 IAM Role,给 Spot Instance 访问 S3 Bucket、SNS 和 SSM 的权限
5)启动 P5 Spot Instance
下面采用 run-instances 命令启动 Spot 实例,具体参数说明见:https://docs.thinkwithwp.com/cli/latest/reference/ec2/run-instances.html
对于 LLM 的微调任务,image-id 可以采用下面的两种 AMI:
- Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)
详见:https://thinkwithwp.com/releasenotes/aws-deep-learning-base-gpu-ami-ubuntu-22-04/
- Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.2.0 (Ubuntu 20.04)
详见:https://thinkwithwp.com/releasenotes/aws-deep-learning-ami-gpu-pytorch-2-2-ubuntu-20-04/
run-instances 命令的参考示例:
请按照自身环境配置,修改***的部分,其中 ami 采用 Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.2.0 (Ubuntu 20.04) 做测试。
当执行 run-instances 命令返回 instance 信息时,表示成功启动 Spot Instance,记录 InstanceId 和 PrivateIpAddress。
5. 操作 Spot Instance
1)登陆到 Jumpserver,通过 Spot Instance 的 PrivateIpAddress 和 ubuntu 用户,再登陆到 Spot Instance 上。
2)安装 Mountpoint for Amazon S3,参考 https://docs.thinkwithwp.com/AmazonS3/latest/userguide/mountpoint.html。
操作步骤如下:
将 S3 Bucket(p5-spot-test)mount 到本地~/s3目录。
3)访问 S3 数据
4)可以通过 SNS 发消息,用于通知任务执行完成的状态
邮箱将收到通知邮件。
5)终止 Spot Instance
在 Linux 环境中,执行下列的命令:
6)AMI 环境介绍
本文示例采用 AWS Deep Learning AMI,包含了 NVIDIA CUDA和NVIDIA cuDNN,也包含最流行的深度学习框架。
比如 AMI(Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.2.0 (Ubuntu 20.04) )包含一个 Conda 环境,部署了 NVIDIA Driver R535, CUDA(12.1.1), cuDNN(8.9.5),NCCL(2.19.4),和EFA(1.31.0)。AMI 中的软件可能会在未来升级和更新。
在 Ubuntu 上的指令操作演示:
7)Elastic Fabric Adapter(EFA)
EFA 是一种网络设备,附加在 EC2 实例上,可以获得较低的时延和更高的吞吐量,加速 HPC 任务和 ML 应用。
P5 实例类型具有 3200 Gbps 的网络带宽,使用 32 个 EFA 网卡。在多机多卡的训练环境中,需要配置 EFA,加速 EC2 实例之间的通讯。
P5 实例的 EFA 配置参见:https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/p5-efa.html
6. 创建 EventBridge Rule
1)添加 Rule,响应 EC2 Spot 中断事件
2)添加 Rule,响应 EC2 Instance 的启动和终止等事件
7. 配置 Fault Injection Service
创建 Resilience Hub 的 Experiment templates,可以模拟中断 Spot Instance。
按照下面的参数进行配置。
成功创建 Experiment template 之后,可以点击右上角 Start experiment 按钮,进行 Spot 中断模拟。
邮箱将收到 Spot Instance 中断的信息。
结论
在这篇文章中,介绍了启动和管理 P5 Spot 实例的方法,P5 实例是亚马逊最新的机器学习训练机型,有强大的性能和显存容量,可以更好地支持 LLM 的微调任务。开发者可以参考文中提供的 AWS CLI 命令,根据自身需求,开发完整 Spot 管理系统,利用 EC2 P5 Spot 实例完成低成本高算力的机器学习任务。
参考资料
- https://thinkwithwp.com/ec2/spot/
- https://thinkwithwp.com/blogs/aws/new-amazon-ec2-p5-instances-powered-by-nvidia-h100-tensor-core-gpus-for-accelerating-generative-ai-and-hpc-applications/
- https://thinkwithwp.com/ec2/instance-types/p5/
- https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/spot-placement-score.html
- https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html
- https://docs.thinkwithwp.com/AmazonS3/latest/userguide/mountpoint.html
- https://docs.thinkwithwp.com/dlami/latest/devguide/appendix-ami-release-notes.html
- https://docs.thinkwithwp.com/cli/latest/reference/ec2/run-instances.html
- https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/spot-best-practices.html
- https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/using-spot-limits.html
- https://docs.thinkwithwp.com/dlami/latest/devguide/what-is-dlami.html
- https://docs.thinkwithwp.com/AWSEC2/latest/UserGuide/p5-efa.html