Kubernetes场景下基于Nvidia GPU Operator 实现图形渲染能力

科技   2024-07-26 11:05   四川  

背景

现需要在Kubernetes平台上以容器的形态部署业务程序,借助NVIDIA 开源的GPU-operator组件来实现GPU显卡的调度和渲染能力。

方案简介

通过在Kubernetes集群部署gpu-operator全家桶程序,它提供了nvidia驱动的安装,实现了deviceplugin能力提供了gpu显卡的调度能力,还提供了gpu相关的指标。

image

实施步骤

在安装gpu-operator之前需要确保基础环境的一致:

  • GPU显卡型号: Nvidia T4

  • GPU节点操作系统: Ubuntu22.04

  • 容器引擎: docker

安装nvidia gpu-operator

可参考nvidia官方文档资料: https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html#

  1. 由于安装形式是operator,需要先配置helm客户端 helm的部署安装,可参考: https://support.huaweicloud.com/usermanual-cce/cce_10_0144.html

  2. 添加nvidia helm仓库

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
image
  1. 指定驱动版本安装gpu-operator
helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator \ --set driver.version=470.141.03
image

需要注意部分镜像可能会拉取失败导致安装失败,可以提前准备好拉取到节点上

  1. 观察gpu-operator运行状态

由于nvidia驱动的下载编译安装,需要等待片刻才能就绪,观察kubernetes集群中gpu-operator的运行状态

image

此时集群还没下发GPU节点,部分daemonset程序还未拉起。扩容GPU节点池,创建GPU节点

image

节点下发后,可以看到,每个节点都会运行daemonset程序,实现nvidia驱动的安装,gpu显卡资源的上报和调度等

image

等待片刻后,各组件均已正常运行。(如果daemonset程序中,部分组件长时间未就绪,可通过手动重启pod进行解决)

image
  1. 查看GPU节点状态

可以看到节点状态为GPU驱动未就绪,现在点击节点可以发现GPU显卡配额

image

也可查看gpu节点的yaml进行确认

image

创建工作负载申请gpu显卡资源,下发图形渲染任务

  1. 使用图形渲染软件Blender,工作负载yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    version: v1
  name: blender
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blender
      version: v1
  template:
    metadata:
      labels:
        app: blender
        version: v1
    spec:
      containers:
      - image: swr.cn-east-3.myhuaweicloud.com/hz-cloud/blender:4.1.1
        imagePullPolicy: IfNotPresent
        name: container-1
        resources:
          limits:
            nvidia.com/gpu: "1"
          requests:
            cpu: 250m
            memory: 512Mi

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: blender
    version: v1
  name: blender
  namespace: default
spec:
  ports:
  - name: cce-service-0
    port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: blender
    version: v1
  type: NodePort

等待Pod就绪:

image
  1. 登录pod进行确认gpu显卡是否已经挂载
image

查看容器中的环境变量,确认存在: NVIDIA_DRIVER_CAPABILITIES=all

image
  1. 访问业务前端配置渲染属性

配置渲染属性: 渲染引擎选择 Cycles,设备选择GPU计算

image

确认Blender程序已经探测到nvidia T4显卡

image
  1. 实施图形渲染
image

开始渲染,目前进度为:

image
  1. 观察容器的gpu使用情况

容器内可使用 watch -d nvidia-smi 动态查看gpu的使用情况: 可以发现显存和算力的使用都有在提升

image

关于GPU相关指标的查看

gpu-operator 会在集群中以daemonset的形式安装dcgm-exporter程序,该程序会通过9400端口暴露该GPU节点上的gpu相关指标

image

手动访问: curl podip:9400/metrics 查看指标:

image

后续集群如果集成了Prometehus监控系统可通过编写servicemonitor进行指标任务的采集,方便查看集群中GPU的使用情况。

()https://bbs.huaweicloud.com/blogs/428524


运维开发故事
由一群志同道合的小伙伴共同维护,有运维也有开发,内容不限于Linux运维,devops工具链,k8s容器化技术,监控,日志收集,网络安全,Python或GO开发,团队成员有乔克、wanger、冬哥、素心、华仔、郑哥、夏老师
 最新文章