k8s 调度 GPU

最近公司有项目想在 k8s 集群中运行 GPU 任务,于是研究了一下。下面是部署的步骤。

1. 首先得有一个可以运行的 k8s 集群. 集群部署参考 kubeadm安装k8s 

2. 准备 GPU 节点

2.1 安装驱动

1
2
3
4
5
curl -fsSL https://mirrors.aliyun.com/nvidia-cuda/ubuntu1804/x86_64/7fa2af80.pub | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/nvidia-cuda/ubuntu1804/x86_64/ ./" > /etc/apt/sources.list.d/cuda.list
 
apt-get update
apt-get install -y cuda-drivers-455 # 按需要安装对应的版本

2.2 安装 nvidia-docker2

<!-- Note that you need to install the nvidia-docker2 package and not the nvidia-container-toolkit. This is because the new --gpus options hasn't reached kubernetes yet -->

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
 
sudo apt-get update && sudo apt-get install -y nvidia-docker2
 
## /etc/docker/daemon.json 文件中加入以下内容, 使默认的运行时是 nvidia
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
 
## 重启 docker
sudo systemctl restart docker

2.3 在 k8s 集群中安装 nvidia-device-plugin 使集群支持 GPU

1
2
3
4
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.7.3/nvidia-device-plugin.yml
 
# 如果因为网络问题访问不到该文件, 可在浏览器打开 https://github.com/NVIDIA/k8s-device-plugin/blob/v0.7.3/nvidia-device-plugin.yml
## 把文件内容拷贝到本地执行

    nvidia-device-plugin 做三件事情

  • Expose the number of GPUs on each nodes of your cluster

  • Keep track of the health of your GPUs

  • Run GPU enabled containers in your Kubernetes cluster.

之后把节点加入 k8s 集群
以上步骤成功完成之后, 运行以下命令能看到类似下面图片中的内容说明插件安装好了
1
2
kubectl get pod --all-namespaces | grep nvidia
kubectl describe node 10.31.0.17

 

 

3. 运行 GPU Jobs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cat nvidia-gpu-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: cuda-container
      image: nvidia/cuda:9.0-devel
      resources:
        limits:
          nvidia.com/gpu: 2 # requesting 2 GPUs
    - name: digits-container
      image: nvidia/digits:6.0
      resources:
        limits:
          nvidia.com/gpu: 2 # requesting 2 GPUs
1
2
3
4
5
kubectl apply -f nvidia-gpu-demo.yaml
 
kubectl exec -it xxx-76dd5bd849-hlmdr -- bash
 
# nvidia-smi

  

以上就简单实现了 k8s 调度 GPU 任务。 

如有遇到问题可在留言区讨论。

 

posted @   运维工作栈  阅读(3732)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示