保持高性能,Amazon EC2 Spot 实例节省超 3 倍 LLM 推理成本

Amazon EC2
Amazon Command Line Interface
大语言模型
0
0
### **使用场景** 随着生成式 AI 的飞速发展,大语言模型(LLM)在智能对话、内容生成、知识问答等领域得到了广泛应用。许多企业开始将 LLM 集成到其产品和服务中,以提供更加智能、人性化的用户体验。**然而,LLM 的推理过程需要强大的算力,包括显存资源,这使得在现代硬件平台上高效服务这些模型变得极具挑战性**。特别是对于角色扮演这一类面向 C 端的应用,其用户规模大、对话轮次多、同时要求推理速度快,高昂的推理费用也成为应用规模化的一大阻碍。 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)提供的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例为解决这一问题提供了经济高效的方案。[Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例价格可以低至按需实例价格的一折。**通过使用 [Amazon EC2 Spot 实例](https://aws.amazon.com/cn/ec2/spot/?trk=cndc-detail), 在维持高性能的同时能显著降低 LLM 的推理成本。** ### **场景** 在使用 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例优化 LLM 推理成本时,会遇到下列场景: * **实例中断**:[Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例由亚马逊云科技根据市场供需动态定价,当出价低于市场价时,实例可能会被回收。这对 LLM 推理工作负载的连续性提出了挑战。 * **动态伸缩**:LLM 推理的请求量通常是动态变化的,存在明显的高峰和低谷期,需要根据负载变化自动调整 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例的数量,以平衡成本和性能。 * **异构优化**:LLM 推理对 GPU 性能敏感,[Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)提供了多种类型的 GPU 实例(如 Amazon G4、Amazon G5、Amazon G6、Amazon P4、Amazon P5 系列等),需要根据负载的特点,在保证性能的前提下,选择不同的实例类型来匹配最佳的性价比。 ### **解决方案** #### **介绍** **本解决方案利用 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例结合 [GPU Smart Scheduler(GSS)](https://github.com/tsaol/GSS?trk=cndc-detail)工具,为大语言模型的推理任务提供了一个高性价比的运行环境**。GSS 能够帮助用户方便地管理和调度 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例,并且能够顺利地处理实例中断问题。通过在 GSS 中配置合适的 [**.yaml** 文件](https://github.com/tsaol/GSS/blob/main/sample/awsgpus-cluster.yaml?trk=cndc-detail),用户可以根据自己的需求灵活选择不同类型和数量的 GPU 实例,并且可以对实例进行动态的弹性伸缩,以应对负载的变化。 #### **安装依赖环境** ```js # requires 3.7 <= python <= 3.11. conda create -y -n awsspotgpus python=3.10 conda activate awsspotgpus # Choose your cloud: ``` 安装 GSS。 ```js git clone https://github.com/tsaol/GSS.git cd GSS pip install -e . ``` 配置操作集群的 AKSK。 请确保您已经正确安装 [**Amazon CLI**](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html?trk=cndc-detail),同时在控制台中创建了具有 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Full Access 权限的 Amazon IAM 用户,在 Amazon IAM 用户的安全凭证中创建并保存了访问密钥。请在以下 Amazon configure 命令中输入对应的访问密钥和区域信息: ```js # Install boto pip install boto3 # Configure your AWS credentials aws configure ``` #### **启动集群** 我们用预先在 ./sample/ 目录下提供的 .yaml 文件 awsgpus-cluster.yaml 进行配置,运行以下命令启动 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例集群: ```js HF_TOKEN=hf_xxxxxxxx sky serve up ./sample/awsgpus-cluster.yaml -n llama3 --env HF_TOKEN ``` ![image.png](https://dev-media.amazoncloud.cn/e88c3e4a442f446d955804f35df7e48f_image.png "image.png") **在运行阶段,展示了当前选择的 Region,对应 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 的价格以及可用区,同时会根据我们的配置请求对应的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例**。在控制台 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 请求页可以看到已经请求成功的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例。 ![image.png](https://dev-media.amazoncloud.cn/a27731f6b14249bcaebadc3bfe5af855_image.png "image.png") 当 Replicas 状态变为 READY 时就可以运行了: ```js 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 对以上启动的集群进行访问: ```js sky launch -c llama3-gui ./gui.yaml --env ENDPOINT=\$(sky serve status --endpoint llama3) ``` ![image.png](https://dev-media.amazoncloud.cn/e62c78cf96814c40b2f74f34c47758d2_image.png "image.png") #### **.yaml 文件说明** 服务配置(`service`)。 ```js 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`)。 ```js 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 显卡,在亚马逊云科技的服务平台中是 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)G5 实例家族。 * **cpus**:指定使用的 CPU 数量,这里是 8 个或更多。 * **use_spot**:是否使用 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例,这里设置为 True;如果设置为 False 则使用按需实例。 * **disk_size**:指定磁盘大小,这里是 512GB,以确保能存放下模型检查点。 * **ports**:指定暴露给互联网的端口,这里是 8081。 ### **关于中断** 中断的优雅处理是借助 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 进行大模型推理的重要前提。**[Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例在中断前 2 分钟会发出通知,通过 [Amazon EventBridge](https://aws.amazon.com/cn/eventbridge/?trk=cndc-detail) 可以检测该事件,并采取相应的操作。** 以下是 [Amazon EventBridge](https://aws.amazon.com/cn/eventbridge/?trk=cndc-detail) 提供的标准通知事件样例: ![image.png](https://dev-media.amazoncloud.cn/76e5286e1303474f818e8ae099de8af2_image.png "image.png") 在 GSS 中会通过一个 Amazon Lambda 函数接受相关的中断信息: 1. 通知 load_balancer 提前移除相关实例。 2. 启动新的实例,让用户更加平滑地过度中断这个过程。 ```js 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。 ![image.png](https://dev-media.amazoncloud.cn/ea0fc2e6eba748c3bf059193be0b6e65_image.png "image.png") 在图中的 ID 是一个自增的序列,在运行了 2 天后,序列已经增加到了 36。 关闭集群。 ```js sky down llama3 ``` ### **方案收益** 要查看 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例价格,打开 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例控制台→Spot 请求→定价历史记录,选择对应的实例类型即可查看该实例的历史价格波动,您可以查看最近 90 天的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 价格历史记录,并按照实例类型、操作系统和可用区筛选。 在俄勒冈区域,分别以 g5.2xlarge、g5.12xlarge、g5.48xlarge 这三种不同的实例类型为例,每小时单价的平均值在过去一个月内的历史记录如下,请注意,以下价格记录为当前时间统计的历史一个月内的数值,实时价格记录请参照以上步骤在控制台中查看。 此外还可以打开价格计算器,看到和按需实例相比,[Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 提供了高达 63% 的历史平均折扣。 - **价格计算器** https://calculator.aws/#/createCalculator/ec2-enhancement?trk=cndc-detail ### **总结** **本方案介绍了如何利用 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 实例,在带来 3-6 倍的成本节省的同时保证作业稳定运行**。同时详细阐述了如何使用 GSS 来配置固定容量的集群 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)Spot 集群,我们将在下一期介绍如何配置可伸缩的集群。 **参考链接** 1. https://www\.usenix.org/system/files/nsdi23-yang-zongheng.pdf?trk=cndc-detail 2. https://github.com/tsaol/GSS?trk=cndc-detail 3. https://github.com/skypilot-org?trk=cndc-detail 4. https://aws.amazon.com/cn/ec2/faqs/#Spot_instances?trk=cndc-detail ![image.png](https://dev-media.amazoncloud.cn/be8a78359b234345916a7cfc102bf8b7_image.png "image.png")
0
目录
关闭