Kubernetes 深度学习笔记

本文主要记录下 Kubernetes 下运行深度学习框架如 Tensorflow、Caffe2 等一些坑,纯总结性文档

一、先决条件

Kubernetes 运行深度学习应用实际上要解决的唯一问题就是 GPU 调用,以下只描述 Nvidia 相关的问题以及解决方法;要想完成 Kubernetes 对 GPU 调用,首先要满足以下条件:

  • Nvidia 显卡驱动安装正确
  • CUDA 安装正确
  • Nvidia Docker 安装正确

关于 Nvidia 驱动和 CUDA 请自行查找安装方法,如果这两部都搞不定,那么不用继续了

还有一点需要注意: /var/lib 这个目录不能处于单独分区中,具体原因下面阐述

二、Nvidia Docker 安装

在安装 Nvidia Docker 之前,请确保 Nvidia 驱动以及 CUDA 安装成功,并且 nvidia-smi 能正确显示,如下图所示(来源于网络)

nvidia-smi

Nvidia Docker 安装极其简单,具体可参考 官方文档,安装完成后请自行按照官方文档描述进行测试,这一步一般不会出现问题

如果测试成功后,请查看 /var/lib/nvidia-docker/volumes 目录下是否有文件,如果没有,那就意味着 Nvidia Docker 并未生成相关的驱动文件成功,需要单独执行 docker volume create --driver=nvidia-docker --name=nvidia_driver_$(modinfo -F version nvidia) 以生成该文件;该命令生成的方式是将已经安装到系统的相关文件硬链接至此,所以要求 /var/lib 目录不能在单独的分区;驱动生成完成后应该会产生类似 /var/lib/nvidia-docker/volumes/nvidia_driver/375.66 的目录结构

三、Kubernetes 配置

当所有基础环境就绪后,最后需要开启 Kubernetes 对 GPU 支持;Kubernetes GPU 文档可以参考 这里,实际主要就是在 kubelet 启动时增加 --feature-gates="Accelerators=true" 参数,如下所示

Accelerators

所有节点全部修改完成后重启 kubelet 即可,如果一台机器上有不同型号的显卡,同时希望 Pod 能区别使用不同的 GPU 则可以按照 官方文档 增加相应设置

四、Deployment 设置

Deployment 部署采用一个 Tensorflow 镜像作为示例,部署配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: tensorflow
labels:
name: tensorflow
spec:
replicas: 1
template:
metadata:
labels:
name: tensorflow
spec:
containers:
- name: tensorflow
image: tensorflow/tensorflow:1.4.0-rc0-gpu
imagePullPolicy: IfNotPresent
command: ["bash","-c","sleep 999999"]
ports:
- name: tensorflow
containerPort: 8888
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 1
volumeMounts:
- mountPath: /usr/local/nvidia
name: nvidia-driver
- mountPath: /dev/nvidia0
name: nvidia0
- mountPath: /dev/nvidia-uvm
name: nvidia-uvm
- mountPath: /dev/nvidia-uvm-tools
name: nvidia-uvm-tools
- mountPath: /dev/nvidiactl
name: nvidiactl
volumes:
- name: nvidia-driver
hostPath:
path: /var/lib/nvidia-docker/volumes/nvidia_driver/375.66
- name: nvidia0
hostPath:
path: /dev/nvidia0
- name: nvidia-uvm
hostPath:
path: /dev/nvidia-uvm
- name: nvidia-uvm-tools
hostPath:
path: /dev/nvidia-uvm-tools
- name: nvidiactl
hostPath:
path: /dev/nvidiactl

Deployment 中运行的 Pod 需要挂载对应的宿主机设备文件以及驱动文件才能正确的调用宿主机 GPU,所以一定要确保前几步生成的相关驱动文件等没问题;如果有多个 nvidia 显卡的话可能需要挂载多个 nvidia 设备

Pod 运行成功后可执行以下代码测试 GPU 调用

1
2
3
4
5
6
7
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))

成功后截图如下

Tensorflow


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 国际许可协议进行许可,转载请注明出处。