低成本大语言模型推理实战:利用Azure Spot GPU实例

2024/12/2 21:03:13

本文主要是介绍低成本大语言模型推理实战:利用Azure Spot GPU实例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

使用Spot GPU实例进行低成本大模型推理工作负载指南

前言

在 Scogo,我们成功地使用 Azure Spot GPU 实例,辅以精选的按需 GPU 实例来支持我们在生产环境中运行大型语言模型推理工作负载。本指南基于我们在 Scogo 的丰富实践经验,我们利用开源模型和自定义微调模型来实现最佳性能和成本效益兼顾。

继续看下去……

什么是LLM推理任务?

大型语言模型(如GPT-4、BERT和T5)通过使机器能够处理和生成类似人类的文本,彻底革新了自然语言处理领域。这些模型为聊天机器人、自动客服和内容生成等应用提供了支持。推理过程利用这些预训练模型根据新输入生成预测或文本。

大型语言模型的推理是计算密集型的,因为模型拥有数十亿的参数——参数数量之多,堪比银河系中的星星。需要强大的并行处理能力来保证高效执行,GPU正好能满足这一需求。它们执行并行计算的能力对于大型语言模型推理的实时或准实时性能至关重要。

成本挑战

在云端运行GPU密集型的工作负载可能会很昂贵,特别是在大规模情况下。虽然按需实例很灵活,但成本会迅速上升。这对资金有限的初创公司和中小企业来说是一个主要障碍。

GPU需求高,这推高价格,而保持高可用性和可扩展性也增加成本。因此,找到低成本的解决方案对于可持续发展的AI/ML运营至关重要。

了解Spot实例(Spot Instances)

竞价实例是与按需实例相比价格大幅降低的未被使用的云计算资源。云提供商以折扣价出售这些未使用的资源,但有以下条件:当按需实例的需求增加时,这些竞价实例可能会被突然收回。这种潜在的突然终止会带来挑战,但成本节约非常显著,这让竞价实例成为许多工作负载的经济选择。

Spot实例的挑战和规则:

  1. 中断:主要的挑战在于中断的风险。云服务提供商可以在没有或很少通知的情况下终止抢占式实例,这使得它们不适合长时间运行且有状态的应用程序,除非采取额外的处理措施。
  2. 有限的可用性:抢占式实例可能并不总是可用。它们的可用性会因云提供商数据中心中资源的整体需求而波动。
  3. 价格波动:抢占式实例的价格可能会变化,有时会有显著变化,这取决于供需动态,从而引入成本的不确定性。
  4. 没有SLA:与按需实例不同,抢占式实例通常不附带服务级别协议(SLA),这意味着没有关于可用性和运行时间的保障。
借助 Kubernetes 管理 Spot 实例的限制问题

Kubernetes 在处理 Spot 实例的动态特性方面表现出色,使其成为缓解这些限制的理想选择。以下是 Kubernetes 如何提供帮助的几个方面:

  1. 自动伸缩:Kubernetes的水平 Pod 自动扩缩器(HPA)和集群控制器(CA)可以根据工作负载需求自动调整Pod和节点的数量。当云提供商收回竞价资源时,Kubernetes 可以迅速启动新的竞价实例或切换到按需实例以维持所需容量。
  2. 节点池:Kubernetes 支持多个节点池,可以配置不同的实例类型和优先级。通过为竞价实例和按需实例创建单独的池,Kubernetes 可以有效平衡成本和可靠性。工作负载可以默认部署在竞价实例上,并在竞价实例被终止时无缝迁移到按需实例。
  3. 容忍度和亲和性:这些高级调度功能可以实现对工作负载放置的精细控制。容忍度允许 Pod 被调度到具有特定污点(如竞价实例)的节点上,而亲和性则确保将关键工作负载在必要时放置在更可靠的按需实例上。
  4. 容错性和韧性:Kubernetes 的自我修复能力能够在节点(包括竞价实例)故障时自动检测并重新安排 Pod,确保运行中的工作负载遭受最小的干扰。有状态应用程序可以利用 Kubernetes 的有状态集和持久卷,在节点终止时保持数据完整性。
  5. 预处理措施:Kubernetes 可以集成云提供商特定的机制来优雅处理竞价实例的终止。例如,利用云提供商提供的终止通知,Kubernetes 可以主动将 Pod 从即将被终止的竞价实例中移出并重新调度到其他实例。

通过利用这些Kubernetes功能,组织可以有效地管理和降低与竞价实例相关的风险,同时最大化成本节约效果。Kubernetes强大的编排能力与竞价实例的经济优势相结合,为高效经济地运行GPU密集型LLM(大型语言模型)推理工作负载提供了强大且实用的解决方案。

在Azure中的GPU选项

Azure在印度的地区提供了一些不错的Nvidia GPU选择,其中一些是我们测试过的型号。

英伟达T4 GPU (Nvidia T4 GPU)

Nvidia T4 是一款多功能 GPU,适用于多种工作负载,如 AI 推理、机器学习和数据分析。在 Azure 平台上,T4 GPU 支持多种实例类型,在性能和成本之间取得了平衡。

Nvidia T4的关键特性是:

  • 16GB GDDR6 内存
  • 2,560 图形处理单元
  • 320 张量核心
  • 混合精度性能可达 65 TFLOPS
    在 AKS 上设置 GPU 实例
Nvidia A100 GPU

Nvidia A100是一款高性能的GPU,专为最复杂的人工智能和HPC工作负载设计。Azure提供基于A100的实例,以满足客户对计算能力的需求。

Nvidia A100: 重要特点:

  • 40GB 或 80GB HBM2e 内存
  • 6,912 个 CUDA 内核数量
  • 432 个 Tensor 内核数量
  • 在混合精度下的性能最高可达 624 TFLOPS
按需实例 (On-Demand) vs. 现货实例 (Spot)

按需实例:

  • 保证可用性
  • 适用于生产工作负载和时间敏感的任务
  • 相比按需实例,价格较高

按需实例:

  • 利用闲置的Azure容量
  • 可在短时间内中断服务
  • 提供显著的成本节约(相比按需定价最多可节省高达90%)
  • 适合容错性和灵活性高的工作负载
Azure(印度中部区域)NVIDIA T4 GPU的成本对比

Azure(印度中区)Nvidia A100 GPU 的成本对比

在AKS上设置GPU环境

前提条件

  • AKS 集群
  • 使用 CLI 访问 AKS 集群
  • 官方说明(使用 AKS GPU 镜像预览)

请按照以下步骤在AKS集群上设置Spot实例GPU节点池

添加和更新扩展程序:

# 注册aks预览扩展
az extension add --name aks-preview  
# 更新aks预览扩展
az extension update --name aks-preview  
# 注册GPUDedicatedVHDPreview功能
az feature register --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"  
# 查看GPUDedicatedVHDPreview功能的状态
az feature show --namespace "Microsoft.ContainerService" --name "GPUDedicatedVHDPreview"  
# 注册Microsoft.ContainerService提供程序
az provider register --namespace "Microsoft.ContainerService"

2. 创建Spot实例节点组。

  • Standard_NC6s_v3
az aks nodepool add --resource-group Scogo_development_RG, --cluster-name Scogo-Development-AKS, --name gpuspot3, --node-count 1, --node-vm-size Standard_NC6s_v3, --node-taints sku=gpu:NoSchedule, --aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true, --enable-cluster-autoscaler, --min-count 1, --max-count 10, --priority Spot
  • Standard_NC4as_T4_v3
az aks nodepool add --resource-group Scogo_development_RG \  
--cluster-name Scogo-Development-AKS --name spotgput4 --node-count 1 \  
--node-vm-size Standard_NC4as_T4_v3 --node-taints sku=gpu:NoSchedule \  
--aks-custom-headers UseGPUDedicatedVHD=true,usegen2vm=true \  
--enable-cluster-autoscaler --min-count 1 --max-count 10 --priority Spot

3. 验证一下 AKS 中的 GPU 实例

  • 查看GPU节点的状态:用于验证GPU节点状态和容量的命令。
    kubectl get nodes  # 获取节点列表
    kubectl describe node <此处输入节点名称>  # 查看指定节点的详细信息
  • 预期输出:在“容量”部分,GPU 应该出现在这里。
    nvidia.com/gpu: 1(一个关于GPU的页面)

您的输出应该看起来像下面的浓缩示例输出。

    名称:               aks-gpunp-28993262-0  
    角色:              agent  
    标签:             accelerator=nvidia  

    [...]  

    容量:  
    [...]  
     NVIDIA GPU:                 1 (英伟达GPU)  
    [...]

4. 部署 GPU 工作负载

  • TensorFlow MNIST 示例的 YAML 文件示例:提供一个用于在 GPU 节点上部署 TensorFlow 任务的 YAML 文件。
apiVersion: 批处理/v1  # apiVersion: batch/v1
kind: 作业  # kind: Job
metadata:  
  labels:  
    应用程序: samples-tf-mnist-demo  # labels: app: samples-tf-mnist-demo
  名称: samples-tf-mnist2-demo  # name: samples-tf-mnist2-demo
spec:  
  模板:  
    metadata:  
      labels:  
        应用程序: samples-tf-mnist-demo  # labels: app: samples-tf-mnist-demo
    spec:  
      容器:  
      - 名称: samples-tf-mnist-demo  # containers: name: samples-tf-mnist-demo
        镜像: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu  # image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu
        参数: ["--max_steps", "500"]  # args: ["--max_steps", "500"]
        镜像拉取策略: IfNotPresent  # imagePullPolicy: IfNotPresent
        资源限制:  
          限制:  
            nvidia.com/gpu: 1  # limits nvidia.com/gpu: 1
      重启策略: 在失败时重启  # restartPolicy: OnFailure
      节点选择器:  
        加速器: nvidia  # nodeSelector: accelerator: nvidia
      容忍:  
      - 键: "sku"  
        操作符: "Equal"  
        值: "gpu"  
        效果: "NoSchedule"  
      - 键: "kubernetes.azure.com/scalesetpriority"  
        操作符: "Equal"  
        值: "spot"  
        效果: "NoSchedule"
  • 查看作业和Pod的状态:相关命令。
    kubectl get jobs,pods  
    kubectl logs samples-tf-mnist-demo-smnr6  

    ....  
    2019-05-16 16:08:31.396886: INFO tensorflow/core/common_runtime/gpu/gpu_device.cc 行 1120]   
    正在创建 TensorFlow 设备 (/device:GPU:0) -> (设备: 0, 名称: Tesla K80, PCI 总线 ID: 2fd7:00:00.0,   
    计算能力等级: 3.7)  
    .....
我们要来总结一下

对于希望在 Azure 上优化 LLM 推理任务的组织,我们有如下建议:

  1. 将 LLM 推理服务容器化,以在 Kubernetes 上部署。
  2. 实现自动扩展策略,以适应变化的推理负载。
  3. 结合按需实例与竞价实例的使用,以平衡系统可靠性和成本效益。
  4. 定期监控和优化 GPU 使用率及竞价实例使用情况。
  5. 实现强大的日志记录和监控体系,以跟踪推理性能和成本。

通过结合使用Kubernetes与Azure的GPU服务和竞价实例,组织可以构建一个灵活、可扩展且成本效益高的基础设施,用于执行LLM推理。这种方法能够实现资源的最佳利用,同时保持能够处理不同工作负载的能力,并最小化运营成本。



这篇关于低成本大语言模型推理实战:利用Azure Spot GPU实例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程