【AI基础】K8S环境使用GPU--Kubernetes环境(三)

AI时代下,学习如何使用和管理GPU是基础入门技能,本文以常见的NVIDIA GPU为例,介绍在普通机器、Docker和Kubernetes等不同的环境下如何使用和管理GPU。

一、概述

以常见的NVIDIA GPU为例,系统为Linux

1.1 裸机环境BMS

安装对应的GPU Driver(GPU驱动),以及CUDA Toolkit

1.2 Docker环境

需额外安装nvidia-container-toolkit,配置docker使用nvidia-runtime

1.3 Kubernetes环境

需额外安装对应的device-plugin,使得kubelet能感知到节点上的GPU设备

备注:一般在k8s环境,直接使用gpu-operator方案安装

二、K8S环境

2.1 K8S集群部署组件

2.1.1 gpu-device-plugin——管理GPU

gpu-device-plugin 以DaemonSet方式运行到集群各个节点,进行资源感知。感知节点上的GPU设备,上报到kube-apiserver,让K8S能够对节点上GPU设备进行管理。

2.1.2 gpu-exporter——监控GPU

gpu-exporter 同样以DaemonSet方式运行在集群各个节点上,进行监控数据采集与上报。以Prometheus支持的格式,采集并上报GPU设备支持的metrics监控指标,用于监控GPU。

2.2 Kubernetes调度GPU的工作流程

2.2.1 节点kubelet组件定时上报GPU设备状态至调度器

  • 每个节点kubelet组件,维护该节点的GPU设备状态(哪些已用,哪些未用,哪些不可用)
  • 调度器感知每个节点,都有多少张GPU卡可用

2.2.2 调度器为Pod选择合适节点

  • 调度器从符合条件的节点中选择一个节点,为Pod选择节点

2.2.3 节点Kubelet组件为Pod分配GPU设备ID,传递给Device Plugin

  • 当Pod调用到节点上后,kubelet组件为Pod分配GPU设备ID(GPU编号)
  • 节点kubelet组件,将GPU设备ID作为参数传递给NVIDIA Device Plugin

2.2.4 NVIDIA Device Plugin将GPU设备ID写入容器环境变量,返回给Kubelet组件

  • NVIDIA Device Plugin将分配给该Pod容器的GPU设备ID,写入到容器的环境变量NVIDIA_VISIBLE_DEVICES中,然后将信息返回给节点kubelet组件

2.2.5 节点Kubelet组件启动容器

  • 节点Kubelet组件启动容器

2.2.6 NVIDIA Container Toolkit根据环境变量将GPU设备挂载到容器上

  • NVIDIA Container Toolkit检测容器spec 存在环境变量 NVIDIA_VISIBLE_DEVICES
  • 根据环境变量的值将GPU设备挂载到容器上

与Docker环境的使用差异

  • Docker环境,启动容器时通过 --gpu 参数,手动指定分配给容器的GPU
  • K8S环境,通过device-plugin自行管理

2.3 安装device-plugin

一般由对应GPU厂商提供,比如NVIDIA的k8s-device-plugin

2.3.1 获取device-plugin的yaml

2.3.2 yaml apply到集群

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.15.0/deployments/static/nvidia-device-plugin.yml

2.3.3 检查device-plugin-daemonset

kubectl get pod -l app=nvidia-device-plugin-daemonset

2.4 查看节点GPU设备

2.4.1 device-plugin启动并上报GPU信息

device-plugin 启动后,将感知节点上GPU设备并上报给kubelet,由kubelet提交到kube-apiserver

2.4.2 Node describe GPU信息

可查看Node的资源信息,包括Capacity跟Allocatable信息,即节点总容量和节点可分配容量

kubectl describe node x.x.x.x | grep capacity

可查看节点的Capacity跟,其中 nvidia.com/gpu:8,即表示该节点的GPU卡数

nvidia.com/gpu:       8 #代表该节点的GPU卡数       

2.5 安装GPU监控

DCGM Exporter(Data Center GPU Manager,DCGM),是NVIDIA推出的数据中心GPU监控管理器,可用于集群NVIDIA GPU各种性能指标和状态信息的监控,包括不限于GPU使用率、显存使用、功率、温度等

通过DCGM exporter,结合Prometheus可输出GPU监控信息,再搭配Grafana可构建丰富的GPU监控仪表大盘。

helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts    #添加NVIDIA的Helm Chart仓库


helm repo update        #更新Chart仓库


helm install --generate-name gpu-helm-charts/dcgm-exporter    #安装dcgm-exporter

2.5.1 查看GPU metrics

通过curl节点上暴露的metrics接口,可查看GPU的metrics指标

curl -sL http://127.0.0.1:8080/metrics

2.6 创建GPU Pod

Kubernetes创建GPU Pod,跟申请常规的cpu、memory资源一样,在resource中带上 nvidia.com/gpu: 1,通过定义yaml进行Apply申请就可以。

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod-test
spec:
  containers:
    - name: cuda-container
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
      resources:
        limits:
          nvidia.com/gpu: 2 # 申请2张GPU卡

kube-scheduler接收到该资源时,会将其调度至有GPU资源的节点上。

至此,就可以在Kubernetes环境中使用GPU了。

结语

通过三篇文章,介绍了如何在普通机器、Docker环境、Kubernetes环境中使用GPU。

后续,将介绍如何在Kubernetes环境搭建AI应用,敬请期待~

你可能感兴趣的:(AI基础入门,人工智能,kubernetes,docker,gpu算力,AI编程)