文档章节

Kubernetes安装GPU支持插件

openthings
 openthings
发布于 2018/05/07 16:56
字数 1449
阅读 2398
收藏 1

Kubernetes安装GPU支持插件

  • Kubernetes1.10.x可以直接支持GPU的容器调度运行了,通过安装该插件即可。
  • 这里的方法基于NVIDIA device plugin,仅支持Nvidia的显卡和Tesla计算卡。
  • 主要步骤:
    1. 安装图形卡的Nvidia Drivers。​​​​​
    2. 安装Nvidia-Docker2容器运行时。
    3. 启用Nvidia-Docker2为容器引擎默认运行时。
    4. 启用Docker服务的GPU加速支持。
    5. 安装NVIDIA device plugin。
    6. 启用Kubernetes的GPU支持。

一、安装NVidia支持的Docker引擎

安装NVidia支持的Docker引擎,就可以在容器中使用GPU了。具体步骤如下:

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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

# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

注意,现在像上面运行 Docker 可以直接支持GPU了,不用再单独运行Docker-Nvidia命令了,大大增强了与各种容器编排系统的兼容性,Kubernetes目前也已经可以支持Docker容器运行GPU了。

目前版本依赖Docker 18.03版,如果已经安装了其它版本,可以指定安装的版本,如下:

sudo apt install docker-ce=18.03.1~ce-0~ubuntu

二、安装Nvidia的Kubernetes GPU插件

Kubernetes的NVIDIA device plugin是Daemonset,允许自动地:

  • 公开集群中每一个节点的GPU数量。
  • 对GPU运行健康状况保持跟踪。
  • 在Kubernetes中运行支持的GPU容器实例。

 Kubernetes device plugin 项目包含Nvidia的官方实现。

2.1 环境要求

运行NVIDIA device plugin的环境要求如下:

2.2 准备 GPU Nodes

下面的步骤需要在所有的GPU节点上执行。此外,在此之前 NVIDIA drivers 和 nvidia-docker 必须已经成功安装。

首先,检查每一个节点,启用 nvidia runtime为缺省的容器运行时。我们将编辑docker daemon config文件,位于/etc/docker/daemon.json

{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

上面的这一行("exec-opts": ["native.cgroupdriver=systemd"])是在Ubuntu16.04+DockerCE上面必须要的,否则kubelet无法成功启动(参考 https://my.oschina.net/u/2306127/blog/1628082)。

如果 runtimes 没有, 到nvidia-docker 参考,首先进行安装。

第二步,启用 DevicePlugins feature gate,在每一个GPU节点都要设置。

如果你的 Kubernetes cluster是通过kubeadm部署的,并且节点运行systemd,需要打开kubeadm 的systemd unit文件,位于 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 然后添加下面的参数作为环境变量:

Environment="KUBELET_GPU_ARGS=--feature-gates=DevicePlugins=true"

If you spot the Accelerators feature gate you should remove it as it might interfere with the DevicePlugins feature gate

完整的文件如下(/etc/systemd/system/kubelet.service.d/10-kubeadm.conf):

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
Environment="KUBELET_GPU_ARGS=--feature-gates=DevicePlugins=true"

ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_CGROUP_ARGS $KUBELET_EXTRA_ARGS $KUBELET_GPU_ARGS

重新载入配置文件,然后重新启动服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

In this guide we used kubeadm and kubectl as the method for setting up and administering the Kubernetes cluster, but there are many ways to deploy a Kubernetes cluster. To enable the DevicePlugins feature gate if you are not using the kubeadm + systemd configuration, you will need to make sure that the arguments that are passed to Kubelet include the following --feature-gates=DevicePlugins=true.

2.3 在Kubernetes中启用GPU支持

完成所有的GPU节点的选项启用,然后就可以在在Kubernetes中启用GPU支持,通过安装Nvidia提供的Daemonset服务来实现,方法如下:

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.10/nvidia-device-plugin.yml

2.4 运行需要GPU的工作负载

NVIDIA GPUs 调用可以通过容器级别资源请求来实现,使用resource name为 nvidia.com/gpu:

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

⚠️注意: 如果未指定GPU资源请求,在使用 device plugin 的 NVIDIA images,将使用容器中公开的所有GPU资源。

2.5 文档

⚠️请注意:

  • device plugin feature is still alpha which is why it requires the feature gate to be enabled.
  • the NVIDIA device plugin is still considered alpha and is missing
    • Security features
    • More comprehensive GPU health checking features
    • GPU cleanup features
    • ...
  • support will only be provided for the official NVIDIA device plugin.

下面将重点介绍如何构建device plugin和运行。

2.6 通过Docker

构建-Build

选项 1, 拉取预先编译的容器镜像,到 Docker Hub

$ docker pull nvidia/k8s-device-plugin:1.10

选项 2, 不拉取代码库自行构建容器镜像:

$ docker build -t nvidia/k8s-device-plugin:1.10 https://github.com/NVIDIA/k8s-device-plugin.git#v1.10

选项 3, 拉取代码库自行构建,可以修改:

$ git clone https://github.com/NVIDIA/k8s-device-plugin.git && cd k8s-device-plugin
$ docker build -t nvidia/k8s-device-plugin:1.10 .

本地运行

$ docker run --security-opt=no-new-privileges --cap-drop=ALL --network=none -it -v /var/lib/kubelet/device-plugins:/var/lib/kubelet/device-plugins nvidia/k8s-device-plugin:1.10

部署为DaemonSet:

$ kubectl create -f nvidia-device-plugin.yml

2.7 不用Docker

构建-Build

$ C_INCLUDE_PATH=/usr/local/cuda/include LIBRARY_PATH=/usr/local/cuda/lib64 go build

本地运行

$ ./k8s-device-plugin

2.8 问题反馈和贡献

三、Spark的GPU支持方法研究

只要容器可以支持GPU,在里面运行Spark也就不是事儿了。具体方案可以参考:

© 著作权归作者所有

openthings
粉丝 325
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
Kubernetes集群升级NVidia GPU驱动版本

最近Kubernetes、Docker和NVidia GPU驱动都进行了较大的升级,因此考虑对Kubernetes集群升级NVidia GPU驱动版本。我这里使用Ubuntu 18.04LTS + NVidia GPU Driver 410.78 + Kubernetes 1.13....

openthings
01/04
437
0
Kubernetes中调度GPU资源

Kubernetes中调度GPU资源 Kubernetes 包含一个体验性的功能,支持 AMD和NVIDIA GPUs 跨节点调度。对 NVIDIA GPUs 支持从 v1.6开始,然后经过几次不兼容的叠代修改,对AMD GPUs 的支持从 v1.9...

openthings
01/04
873
0
Ubuntu 18.04 LTS安装Kubernetes 1.11

Ubuntu 18.04 + Kuberntes 1.11.2 + Istio 1.0组合来了。 完整安装说明,参考: https://linuxconfig.org/how-to-install-kubernetes-on-ubuntu-18-04-bionic-beaver-linux 安装的其它细节问......

openthings
2018/08/04
4.7K
1
kubeadm安装kubernetes 1.13.1集群完整记录

k8s是什么   Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统。在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大...

上尉j
01/03
0
0
2017年最后一次更新,Kubernetes 1.9发布!

  【IT168 技术】根据CNCF的最新调查,有 61%的机构正在评估Kubernetes,83%的机构正在使用Kubernetes进行生产。世界上最大的长途拼车社区BlaBlaCar上拥有来自22个国家的4000万会员, 大约...

it168网站
2017/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部