GPU加速云原生应用,开启高性能计算新纪元

温馨提醒
总结摘要
本文深入探讨了在 Kubernetes(特别是 Rancher 管理的集群)中集成 GPU 资源的技术路径与业务价值。文章从 GPU 与云原生结合的优势出发,系统梳理了其在深度学习、科学计算、视频处理等行业的典型应用场景,并重点介绍了基于 gpushare-device-plugin 和 scheduler extender 的 GPU 共享调度方案,包括在 Rancher/RKE 环境下的完整部署配置流程。同时,总结了生产环境中关于驱动兼容性、资源隔离、数据本地化、监控告警等关键最佳实践,为构建高效、稳定、可扩展的 GPU 云原生平台提供实战参考。

GPU加速云原生应用,开启高性能计算新纪元

GPU与Kubernetes的组合,正开启云计算一个崭新的高性能计算时代。

结合Kubernetes弹性调度与GPU强大算力,各类人工智能、科学计算等工作负载,将迎来前所未有的性能提升、资源效率和故障容错能力。让我们一起乘坐这辆高速计算之车,开启云原生应用的新纪元!

Kubernetes环境下GPU的独特魅力

结合Kubernetes环境下GPU的独特魅力,您可以在计算密集型任务中实现更高的性能、更灵活的资源管理和更低的运维成本。

  • 🚀弹性伸缩: 应用可以根据实际需求弹性扩展或收缩GPU数量,极大提升了训练任务的并发能力。这意味着您可以更快地完成大规模的训练作业,从而加快创新和决策的速度。

  • ⚡️ 秒级调度: Kubernetes原生支持GPU调度,根据集群资源情况灵活调度GPU,瞬间满足计算需求,省去了人工分配的麻烦。您的任务可以立即启动,节省了宝贵的时间。

  • 🛡高可用性: 应用运行多副本,一旦个别节点故障,Kubernetes会自动重调度,保证服务不中断。这为关键业务应用提供了更高的可靠性和稳定性。

  • 💲节省成本: 根据实际负载弹性使用GPU,而不是固定分配,大大提升GPU利用率,降低成本。您可以更加高效地使用硬件资源,优化资源投资回报。

结合Kubernetes的调度与弹性,GPU的算力可以被充分发挥,为各种计算密集型任务提供强大支持。

Kubernetes环境中的GPU应用场景

Kubernetes为GPU创造了一个灵活、高效、可靠的运行环境。下面介绍几大典型的应用场景,突出GPU结合Kubernetes在不同行业中带来的优势和好处:

深度学习与机器学习

🚗 汽车行业: 在汽车行业中,使用深度学习训练自动驾驶算法,进行道路标识识别、车道线检测、前车距离测量、行人和障碍物识别等。GPU强大的并行处理能力可以加速模型训练,使用真实道路场景数据进行持续优化,大幅提升自动驾驶的环境感知和判断能力。这使得自动驾驶技术更加安全和可靠。

AI汽车自动训练模型

🏥 医疗行业: 利用基于深度学习的图像识别模型,对病人CT、MRI等扫描图像进行高效自动分析,实现病变区域检测、肿瘤识别、心血管疾病诊断等功能。相比人工检查,可显著提高检查效率和诊断准确率。医院可以利用存量影像资料训练和优化算法模型,为患者提供更快速、准确的诊断结果。

image-20230728163910578

🏦 金融行业: 金融机构可利用GPU集群进行高频交易、投资组合优化、风险建模等工作负载,分析处理海量市场数据,并使用深度学习进行异常交易检测。相比CPU,GPU的并行计算能力可以极大缩短处理时间和提高交易速度,使得金融机构能够更快地做出决策并获取竞争优势。在金融行业,人工智能和机器学习算法被广泛应用于风险管理、反欺诈、信贷评估、客户服务等方面。通过在容器环境中使用GPU,金融客户可以加速模型训练和推断推理,提高算法的准确性和效率。这有助于客户更好地理解市场趋势、优化决策,并改进风险控制和客户体验。

世界证券交易所排名前十,中国上榜三家,第一规模及金额最大_排行榜123网

科学计算与模拟

🔋 国家电网: 通过大规模稳态仿真分析电网的负载流和故障情况,制定优化运维方案,提高供电可靠性。并行GPU计算极大缩短了仿真时间,有助于及时响应电力市场的变化。这为电力行业提供了更可靠的供电方案和更高的运维效率。

image-20230728163826012

🏭 工业制造业: 使用GPU集群进行航空发动机叶片、机身结构的动力学仿真,在设计阶段就可以检验强度和抗震性能。相比进行物理实验和试飞,计算机仿真大幅降低了验证成本和风险。

💼 **量化交易和算法交易:**GPU在容器环境中的应用可以提高金融客户进行量化交易和算法交易的能力。金融量化模型通常需要进行大规模的数据计算和优化,GPU的并行计算能力可以加速这些计算任务,提高交易系统的实时性和稳定性,同时降低交易成本和风险。

🌾 农业服务: 建立基于GPU的作物生长仿真模型,结合气象、土壤等数据,预测未来产量和质量。还可以模拟不同种植方案的效果。这有助于制定精确的种植策略,提升农业生产效率。

image-20230728163803050

视频处理与图形渲染

视频处理

🎥 媒体制作:利用GPU视频编解码器,可快速处理高清视频素材的剪辑、转码等工作,显著提升媒体制作的效率。同时也可应用于在线视频 conference的实时转码。

🔭 天文研究:天文学家需要分析来自望远镜和探测器的海量影像,进行天体检测和识别。GPU集群可大幅加速图像处理流程,助力新天体和物理现象的发现。

💼 证券交易:为确保高频交易的稳定性,证券交易所需要GPU加速的分布式计算来实时处理大批量订单数据。相比CPU,GPU提供了超高的并发计算能力,可以做到毫秒级别的低延迟处理。

🏥 **医学影像处理:**医疗行业需要大量的影像数据处理,如CT扫描、MRI等。通过在容器环境中使用GPU,可以加速医学图像的分析和处理,例如图像重建、分割、配准等,从而提高医生对患者的诊断准确性和速度。

在Kubernetes中使用GPU的最佳实践

GPU作为高性能计算的加速器,可以大大提升机器学习、深度学习等工作负载的执行效率。但是如何在Kubernetes中合理使用GPU,使其发挥最大效用?

下面我们总结了多次现网实施经验,给准备引入GPU的Kubernetes用户一些建议。

选择适合你的GPU型号

不同的GPU型号 becu如T4,V100,A100等,都有各自的优化方向,比如浮点计算强度、内存带宽等。客户应根据自己的应用类型选购合适的GPU:

  • 以训练为主的用户,建议使用内存带宽高的型号,如V100
  • 推理应用则可选择性价比更高的T4
  • 需要支持多种工作负载的客户,可以选用A100等全能型GPU

混合部署不同的GPU,可以更好满足不同需求,提高资源利用率。

GPU型号示意图

生产环境中的注意事项

在Kubernetes生产环境中使用GPU,还需要注意以下几点:

  • 资源管理:合理设置GPU资源请求和限制,避免应用占用过多资源。
  • 驱动兼容性:确保GPU驱动和Kubernetes版本兼容。
  • 数据本地化:尽量将应用和数据调度到同一个节点,减少数据传输。
  • 异构计算:根据workload特点选择合适的GPU型号,实现异构混合部署。
  • 监控与告警:监控GPU资源利用率,及时发现并告警异常。
  • 安全与隔离:为不同用户设置资源配额,防止相互影响。
  • 备份与迁移:定期备份GPU相关的数据和服务,保证 workload 迁移简单。
  • 自动扩缩容:根据实际负载情况,自动调节 GPU 数量。

image-20230728160524682

优化Kubernetes的GPU调度策略

  • 设置合理的资源请求和限制,防止应用占用过多GPU资源
  • 根据应用特点,选择合适的调度算法,比如优先使用同网段节点
  • 设置节点亲和性和污点,将应用调度到有GPU的节点
  • 隔离不同用户的GPU资源,保证安全
  • 监控GPU利用率,根据负载压力动态调整GPU数量

image-20230728160357062

减少数据传输优化性能

GPU上下文切换和数据传输会拖慢应用性能,客户应该:

  • 尽量使用 locality-aware 的调度方案
  • 将应用和数据尽可能调度到同一节点
  • 使用GPUDirect等技术减少GPU内存复制
  • 批量处理数据以减少传输次数
  • 使用高速网络如RDMA加速节点间通信

image-20230728160754955

保证GPU驱动和软件兼容性

  • 使用与Kubernetes版本兼容的GPU驱动版本
  • 注意运行时和库的兼容性,如CUDA, cuDNN等版本
  • 对关键软件进行验收测试,避免不兼容导致的故障
  • 定期更新驱动和库版本以获取新特性和 Bug 修复

异常检测与自动恢复

  • 监控GPU 的利用率、性能指标、 temperatures温度,设置阈值异常检测
  • 核查日志,排查问题根因,如 OOM,内存泄漏等
  • 设置自动恢复机制,如重启Pod,重新调度等
  • 考虑设置GPU健康检查,保证Pod重新调度到健康GPU

image-20230728160926882

备份与迁移

  • 定期备份GPU 状态数据,模型文件等
  • 记录配置变更catalogue,便于新环境重现配置
  • 准备导出和导入模型的流程,便于迁移模型
  • 在新环境进行全面的测试,确保服务正常运行

技术示例

我们话不多说,直接上实战。

共享GPU的实现主要由两个服务组成:gpushare-scheduler-extender及gpushare-device-plugin

部署GPUshare-scheduler-extender

⾸先需要在集群中安装gpushare-scheduler-extender服务,离线部署场景下,需要提前将容 器镜像下载好。

1
2
3
4
5
6
7
root@master01:~/yaml# kubectl apply -f gpushare-schd-extender.yaml 
clusterrole.rbac.authorization.k8s.io/gpushare-schd-extender created
serviceaccount/gpushare-schd-extender created
clusterrolebinding.rbac.authorization.k8s.io/gpushare-schd-extender created
deployment.apps/gpushare-schd-extender created
service/gpushare-schd-extender created
root@master01:~/yaml#

配置调度⽂件

使⽤GPUshare⽅案需要为集群中的scheduler组件增加调度配置⽂件,不同的Kubernetes版 本有不同的配置⽅式:

以下配置调度⽂件基于Rancher或RKE集群的配置⽅式进⾏描述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
---
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
clientConnection:
# 修改这里的路径信息
  kubeconfig: /etc/kubernetes/ssl/kubecfg-kube-scheduler.yaml
extenders:
- urlPrefix: "http://127.0.0.1:32766/gpushare-scheduler"
  filterVerb: filter
  bindVerb: bind
  enableHTTPS: false
  nodeCacheCapable: true
  managedResources:
  - name: aliyun.com/gpu-mem
    ignoredByScheduler: false
  ignorable: false

将配置⽂件放到所有master节点上的某个⽬录下,如我将配置⽂件放在master节点 的 /root/gpushare-scheduler-extender/config 下

⽂件准备完成后,就可以去Rancher上配置相关的集群参数,在左侧导航栏⽬中点击【集群管 理】,然后找到相应集群并点击【编辑配置】

在集群编辑⻚⾯中,选择使⽤【编辑YAML】,在yaml中配置scheduler服务,示例如下:

1
2
3
4
5
6
7
8
    # 找到scheduler服务配置字段
    scheduler: 
      extra_args:
      # 相当于在scheduler服务中配置了--config=/etc/kubernetes/scheduler-policy-config.yaml
        config: /etc/kubernetes/scheduler-policy-config.yaml
      # 将本地⽬录中scheduler-policy-config.yaml⽂件挂载到scheduler服务中
      extra_binds:
        - /root/gpushare-scheduler-extender/config/scheduler-policy-config.yaml:/etc/kubernetes/scheduler-policy-config.yaml
image-20230728162635450

配置完成后会触发Rancher下集群的update更新,后续操作等待更新完成后再进行。

部署Device-plugin

完成kube-scheduler服务配置后,还需要安装device-plugin服务,此服务主要是⽤来发现节 点gpu资源并上报k8s

使用方式

GPUshare主要通过节点Label来激活使⽤,⾸先需要为节点打上 gpushare=true 的Label, 使⽤Rancher的场景下可以直接在UI上进⾏调整

image-20230728162817387

1
kubectl label node <target_node> gpushare=true

为节点配置好共享标签后,会发现节点将⾃动运⾏ gpushare-device-plugin-ds 服务,因为 此服务中有nodeSelector配置,将⾃动运⾏在具备 gpushare=true 标签的节点,此时我们在 集群中查看节点的信息时会发现节点中上报了相关的gpu信息:

image-20230728162915717

可以看到节点中增加了两种Resource, aliyun.com/gpu-count 代表了节点上有⼏张GPU 卡, aliyun.com/gpu-mem 代表了节点上所有GPU的显存空间,在部署需要使⽤GPU的服务 时,编排⽂件中申明相应资源即可,如:

  • 创建⼀个使⽤⼀张GPU卡资源的服务,可以在服务中添加
image-20230728162935833
  • 创建使⽤GPU显存的服务,可以在服务中添加
image-20230728163106391

使⽤显存切分GPU的话,就可以在显存空间的基础上部署多个服务,如⼀张7G显存 的GPU卡可以部署7个是⽤1G显存的服务,以此类推,实现1张卡⽀持多个应⽤服务

总结

随着技术的进一步成熟,GPU与Kubernetes的融合将赋能更多关键任务的实现,如实时语音翻译、智能对话、个性化推荐等,让人工智能走得更远、走得更快!