亚马逊AWS官方博客

推云揽竞 – 借力竞价实例(Spot), 提升大语言模型云端推理效能

使用场景

随着生成式 AI 的飞速发展,大语言模型(Large Language Models, LLMs)在智能对话、内容生成、知识问答等领域得到了广泛应用。许多企业开始将 LLM 集成到其产品和服务中,以提供更加智能、人性化的用户体验。然而,LLM 的推理过程需要强大的算力,包括显存资源,这使得在现代硬件平台上高效服务这些模型变得极具挑战性。特别是对于角色扮演这一类面向 C 端的应用,其用户规模大,对话轮次多,同时要求推理速度快,高昂的推理费用也成为应用规模化的一大阻碍。

Amazon EC2 提供的 Spot 实例为解决这一问题提供了一个经济高效的方案。Spot 实例价格相比按需实例最低可以达到按需实例价格的一折。通过使用 Spot 实例, 在维持高性能的同时能显著降低大语言模型的推理成本。

挑战

在使用 EC2 Spot 实例优化 LLM 推理成本时,主要面临以下挑战:

  • 实例中断:Spot 实例由亚马逊云科技根据市场供需动态定价,当出价低于市场价时,实例可能会被回收。这对 LLM 推理工作负载的连续性提出了挑战。
  • 动态伸缩:LLM 推理的请求量通常是动态变化的,存在明显的高峰和低谷期,需要根据负载变化自动调整 Spot 实例的数量,以平衡成本和性能。
  • 异构优化:LLM 推理对 GPU 性能敏感,EC2 提供了多种类型的 GPU 实例(如 G4、G5、G6、P4、P5 系列等),需要根据负载的特点,在保证性能的前提下,选择不同的实例类型来匹配最佳的性价比。

解决方案

介绍

本解决方案利用 Amazon EC2 Spot 实例结合 GPU Smart Scheduler(GSS)工具,为大语言模型的推理任务提供了一个高性价比的运行环境。GSS 能够帮助用户方便地管理和调度 Spot 实例,并且能够优雅地处理实例中断问题。通过在 GSS 中配置合适的 yaml 文件,用户可以根据自己的需求灵活选择不同类型和数量的 GPU 实例,并且可以对实例进行动态的弹性伸缩,以应对负载的变化。

安装依赖环境

# requires 3.7 <= python <= 3.11.
conda create -y -n awsspotgpus python=3.10
conda activate awsspotgpus
# Choose your cloud:

安装 GSS

git clone https://github.com/tsaol/GSS.git
cd GSS
pip install -e . 

配置操作集群的 AKSK

请确保您已经正确安装 AWS CLI,同时在控制台中创建了具有 AmazonEC2FullAccess 权限的 IAM 用户,在 IAM 用户的安全凭证中创建并保存了访问密钥。请在以下 AWS configure 命令中输入对应的访问密钥和区域信息:

# Install boto
pip install boto3
# Configure your AWS credentials
aws configure

启动集群

我们用预先在 ./sample/目录下提供的 yaml 文件 awsgpus-cluster.yaml 进行配置,运行以下命令启动 Spot 实例集群:

HF_TOKEN=hf_xxxxxxxx sky serve up ./sample/awsgpus-cluster.yaml -n llama3 --env HF_TOKEN

在运行阶段,展示了当前选择的 region,对应 Spot 的价格以及可用区,同时会根据我们的配置请求对应的 Spot 实例。在控制台 EC2 的 Spot 请求页可以看到已经请求成功的 Spot 实例。

当 Replicas 状态变为 READY 时就可以运行了:

Services
NAME    VERSION  UPTIME  STATUS  REPLICAS  ENDPOINT
llama3  1        1m 55s  READY   3/3       44.200.76.29:30001

Service Replicas
SERVICE_NAME  ID  VERSION  ENDPOINT                   LAUNCHED    RESOURCES                  STATUS  REGION
llama3        1   1        http://3.231.229.47:8081   7 mins ago  1x AWS([Spot]{'A10G': 1})  READY   us-east-1
llama3        2   1        http://3.238.133.168:8081  7 mins ago  1x AWS([Spot]{'A10G': 1})  READY   us-east-1
llama3        3   1        http://44.212.99.147:8081  7 mins ago  1x AWS([Spot]{'A10G': 1})  READY   us-east-1

我们可以启用一个 Web UI 对以上启动的集群进行访问:

sky launch -c llama3-gui ./gui.yaml --env ENDPOINT=$(sky serve status --endpoint llama3)

yaml 文件说明

服务配置service

service:
  replicas: 2
  # An actual request for readiness probe.
  readiness_probe:
    path: /v1/chat/completions
    post_data:
      model: $MODEL_NAME
      messages:
        - role: user
          content: Hello! What is your name?
      max_tokens: 1
  • replicas:指定服务的副本数量,这里设置为 2。
  • readiness_probe:用于检查服务是否准备就绪。通过发送一个请求到/v1/chat/completions 路径,使用指定的模型和消息内容来验证服务的可用性。

资源配置resources

resources:
  accelerators: {A10g}
  cpus: 8+
  use_spot: True
  disk_size: 512  # Ensure model checkpoints can fit.
  disk_tier: best
  ports: 8081  # Expose to internet traffic.
  • accelerators:指定使用的显卡类型和数量,这里制定了 Nvidia A10g 显卡,在亚马逊云平台中是 G5 实例家族。
  • cpus:指定使用的 CPU 数量,这里是 8 个或更多。
  • use_spot:是否使用 Spot 实例,这里设置为 True;如果设置为 False 则使用按需实例。
  • disk_size:指定磁盘大小,这里是 512GB,以确保能存放下模型检查点。
  • ports:指定暴露给互联网的端口,这里是 8081。

关于中断

中断的优雅处理是借助 Spot 进行大模型推理的重要前提。Amazon EC2 的 Spot 实例在中断前 2 分钟会发出通知,通过 Amazon EventBridge 可以检测该事件,并采取相应的操作。

以下是 EventBridge 提供的标准通知事件样例:

在 GSS 中会通过一个 Lambda 函数接受相关的中断信息,(1) 通知 load_balancer 提前移除相关实例;(2) 启动新的实例,让用户更加平滑地过度中断这个过程。

def handle_instance_interrupt(instance_id: str):
    # [1]Find the corresponding ReplicaInfo based on the instance ID
    replica_info = replica_managers.get_replica_by_instance_id(instance_id)
    if replica_info:
        #[2] Set the replica state to TERMINATING
        replica_info.state = ReplicaState.TERMINATING
        #[3] Notify load_balancer to remove the replica from the forwarding targets
        load_balancer.remove_replica(replica_info)

当启动新的实例,新启动的实例 ID 会在当前最大实例 ID 的基础上+1。

在图中的 ID 是一个自增的序列,在运行了 2 天后,序列已经增加到了 36。

关闭集群

sky down llama3

方案收益

要查看 Spot 实例价格,打开 EC2 实例控制台→Spot 请求→定价历史记录,选择对应的实例类型即可查看该实例的历史价格波动,您可以查看最近 90 天的 Spot 价格历史记录,并按照实例类型、操作系统和可用区筛选。

在俄勒冈区域,分别以 g5.2xlarge,g5.12xlarge,g5.48xlarge 这三种不同的实例类型为例,每小时单价的平均值在过去一个月内的历史记录如下,请注意,以下价格记录为当前时间统计的历史一个月内的数值,实时价格记录请参照以上步骤在控制台中查看。

此外还可以打开价格计算器,看到和按需实例相比,Spot 提供了高达 63% 的历史平均折扣。

结论

本方案介绍了如何利用 Amazon Spot Instance,在带来 3-6 倍的成本节省的同时保证作业稳定运行。同时详细阐述了如何使用 GSS 来配置固定容量的集群 Spot 集群,我们将在下一期介绍如何配置可伸缩的集群。

参考链接

https://www.usenix.org/system/files/nsdi23-yang-zongheng.pdf

https://github.com/tsaol/GSS

https://github.com/skypilot-org

https://aws.amazon.com/cn/ec2/faqs/#Spot_instances

本篇作者

曹镏

亚马逊云科技解决方案架构师,专注于为企业级客户提供信息化以及生成式 AI 方案的咨询与设计,在 AI/ML 领域具有解决实际问题能力以及落地大模型训练项目的经验。

郑昊

亚马逊云科技 AI/ML 解决方案架构师。主要专注于 Language Model 的训练及推理、搜推算法及系统基于亚马逊云科技 AI/ML 技术栈的相关优化及方案构建。在阿里、平安有多年算法研发经验。

王泽耀

亚马逊云科技解决方案架构师,面向国内大型企业品牌出海,致力于 AWS 云服务在国内的应用及推广。曾就职于 IBM,服务国内不同行业企业客户。

曹阳

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案的架构咨询与设计,同时致力于亚马逊云科技在各行业中的应用与推广,目前侧重于移动应用以及物联网领域的研究。