Kubernetes GPU使用指南

栏目: 编程工具 · 发布时间: 6年前

内容简介:Kubernetes GPU使用指南

Kubernetes支持容器请求GPU资源(目前仅支持NVIDIA GPU),在深度学习等场景中有大量应用。

在Kubernetes中使用GPU需要预先配置

  • 在所有的Node上安装Nvidia驱动,包括NVIDIA Cuda Toolkit和cuDNN等
  • 在apiserver和kubelet上开启--feature-gates="Accelerators=true"
  • Kubelet配置使用 docker 容器引擎(默认就是docker),其他容器引擎暂不支持该特性

使用方法

使用资源名 http:// alpha.kubernetes.io/nvi dia-gpu 指定请求GPU的个数,如

apiVersion: v1
kind: pod
spec:
  containers:
    - image: gcr.io/tensorflow/tensorflow:latest-gpu
      name: gpu-container-1
      command: ["python"]
      args: ["-u", "-c", "import tensorflow"]
      resources: 
        limits: 
          alpha.kubernetes.io/nvidia-gpu: 2 # requesting 2 GPUs

注意

  • GPU资源必须在resources.limits中请求,resources.requests中无效
  • 容器可以请求1个或多个GPU,不能只请求一部分
  • 多个容器之间不能共享GPU
  • 默认假设所有Node安装了相同型号的GPU

多种型号的GPU

如果集群Node中安装了多种型号的GPU,则可以使用Node Affinity来调度Pod到指定GPU型号的Node上。

首先,在集群初始化时,需要给Node打上GPU型号的标签

NVIDIA_GPU_NAME=$(nvidia-smi --query-gpu=gpu_name --format=csv,noheader --id=0)
source /etc/default/kubelet
KUBELET_OPTS="$KUBELET_OPTS --node-labels='alpha.kubernetes.io/nvidia-gpu-name=$NVIDIA_GPU_NAME'"
echo "KUBELET_OPTS=$KUBELET_OPTS" > /etc/default/kubelet

然后,在创建Pod时设置Node Affinity

kind: pod
apiVersion: v1
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/affinity: >
      {
        "nodeAffinity": {
          "requiredDuringSchedulingIgnoredDuringExecution": {
            "nodeSelectorTerms": [
              {
                "matchExpressions": [
                  {
                    "key": "alpha.kubernetes.io/nvidia-gpu-name",
                    "operator": "In",
                    "values": ["Tesla K80", "Tesla P100"]
                  }
                ]
              }
            ]
          }
        }
      }
spec:
  containers:
    - image: gcr.io/tensorflow/tensorflow:latest-gpu
      name: gpu-container-1
      command: ["python"]
      args: ["-u", "-c", "import tensorflow"]
      resources:
        limits:
          alpha.kubernetes.io/nvidia-gpu: 2

使用CUDA库

NVIDIA Cuda Toolkit和cuDNN等需要预先安装在所有Node上。为了访问/usr/lib/nvidia-367,容器需要运行在特权模式,并将CUDA库以hostPath Volume的形式传给容器。

apiVersion: batch/v1
kind: Job
metadata:
  name: nvidia-smi
  labels:
    name: nvidia-smi
spec:
  template:
    metadata:
      labels:
        name: nvidia-smi
    spec:
      containers:
      - name: nvidia-smi
        image: nvidia/cuda
        command: [ "nvidia-smi" ]
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            alpha.kubernetes.io/nvidia-gpu: 1
        volumeMounts:
        - mountPath: /usr/local/nvidia/bin
          name: bin
        - mountPath: /usr/lib/nvidia
          name: lib
      volumes:
        - name: bin
          hostPath:
            path: /usr/lib/nvidia-375/bin
        - name: lib
          hostPath:
            path: /usr/lib/nvidia-375
      restartPolicy: Never

附录:CUDA安装方法

安装CUDA:

# Check for CUDA and try to install.
if ! dpkg-query -W cuda; then
  # The 16.04 installer works with 16.10.
  curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
  dpkg -i ./cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
  apt-get update
  apt-get install cuda -y
fi

安装cuDNN:

首先到网站 NVIDIA cuDNN 注册,并下载cuDNN v5.1,然后

tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

本文转自《 Kubernetes Handbook 》,欢迎关注。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从Python开始学编程

从Python开始学编程

Vamei / 电子工业出版社 / 2016-11-24 / CNY 49.00

改编自Vamei博客的《Python快速教程》。本书以Python为样本,不仅介绍了编程的基本概念,还着重讲解编程语言的主流范式:面向过程、面向对象、面向函数。读者不仅可以轻松学会Python,以后再学习其他编程语言时也会更加容易。一起来看看 《从Python开始学编程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器