12.2 对GPU的支持

随着人工智能和机器学习的迅速发展,基于GPU的大数据运算越来越普及。在Kubernetes的发展规划中,GPU资源有着非常重要的地位。用户应该能够为其工作任务请求GPU资源,就像请求CPU或内存一样,而Kubernetes将负责调度容器到具有GPU资源的节点上。

目前Kubernetes对NVIDIA和AMD两个厂商的GPU进行了实验性的支持。Kubernetes对NVIDIA GPU的支持是从1.6版本开始的,对AMD GPU的支持是从1.9版本开始的,到1.10版本时达到Beta阶段,并且仍在快速发展。

Kubernetes从1.8版本开始,引入了Device Plugin(设备插件)模型,为设备提供商提供了一种基于插件的、无须修改kubelet核心代码的外部设备启用方式,设备提供商只需在计算节点上以DaemonSet方式启动一个设备插件容器供kubelet调用,即可使用外部设备。目前支持的设备类型包括GPU、高性能NIC卡、FPGA、InfiniBand等,关于设备插件的说明详见官方文档。

下面对如何在Kubernetes中使用GPU资源进行说明。

12.2.1 环境准备

(1)在Kubernetes的1.8和1.9版本中需要在每个工作节点上都为kubelet服务开启--feature-gates="DevicePlugins=true"特性开关。该特性开关从Kubernetes 1.10版本开始默认启用,无须手动设置。

(2)在每个工作节点上都安装NVIDIA GPU或AMD GPU驱动程序,如下所述。

使用NVIDIA GPU的系统要求包括:

◎ NVIDIA驱动程序的版本为384.81及以上;

◎ nvidia-docker的版本为2.0及以上;

◎ kubelet配置的容器运行时(Container Runtime)必须为Docker;

◎ Docker配置的默认运行时(Default Runtime)必须为nvidia-container-runtime,而不能用runc;

◎ Kubernetes版本为1.11及以上。

Docker使用NVIDIA运行时的配置示例(通常配置文件为/etc/docker/daemon.json)如下:

NVIDIA设备驱动的部署YAML文件可以从NVIDIA的GitHub代码库获取,示例如下:

使用AMD GPU的系统要求包括:

◎ 服务器支持ROCm(Radeon Open Computing platform);

◎ ROCm kernel驱动程序或AMD GPU Linux驱动程序为最新版本;

◎ Kubernetes的版本为1.10及以上。

AMD设备驱动的部署YAML文件可以从AMD的GitHub代码库中获取,示例如下:

完成上述配置后,容器应用就能使用GPU资源了。

12.2.2 在容器中使用GPU资源

GPU资源在Kubernetes中的名称为nvidia.com/gpu(NVIDIA类型)或amd.com/gpu(AMD类型),可以对容器进行GPU资源请求的设置。

在下面的例子中为容器申请1个GPU资源:

目前对GPU资源的使用配置有如下限制:

◎ GPU资源请求只能在limits字段进行设置,系统将默认设置requests字段的值等于limits字段的值,不支持只设置requests而不设置limits;

◎ 在多个容器之间或者在多个Pod之间不能共享GPU资源,也不能像CPU一样超量使用(Overcommitting);

◎ 每个容器只能请求整数个(1个或多个)GPU资源,不能请求1个GPU的部分资源。

如果在集群中运行着不同类型的GPU,则Kubernetes支持通过使用Node Label(节点标签)和Node Selector(节点选择器)将Pod调度到合适的GPU所属的节点。

1. 为Node设置合适的Label标签

对于NVIDIA类型的GPU,可以使用kubectl label命令为Node设置不同的标签:

对于AMD类型的GPU,可以使用AMD开发的Node Labeller工具自动为Node设置合适的标签。Node Labeller以DaemonSet的方式部署,可以AMD的GitHub代码库下载YAML文件。在Node Labeller的启动参数中可以设置不同的标签以表示不同的GPU信息。目前支持的标签如下。

(1)Device ID,启动参数为-device-id。

(2)VRAM Size,启动参数为-vram。

(3)Number of SIMD,启动参数为-simd-count。

(4)Number of Compute Unit,启动参数为-cu-count。

(5)Firmware and Feature Versions,启动参数为-firmware。

(6)GPU Family,in two letters acronym,启动参数为-family,family类型以两个字母缩写表示,完整的启动参数为family.SI、family.CI等。其中,SI的全称为Southern Islands;CI的全称为Sea Islands;KV的全称为Kaveri;VI的全称为Volcanic Islands;CZ的全称为Carrizo;AI的全称为Arctic Islands;RV的全称为Raven。

通过Node Labeller工具自动为Node设置标签的示例如下:

2. 设置Node Selector指定调度Pod到目标Node上

以NVIDIA GPU为例:

上面的配置可确保将Pod调度到含有accelerator=nvidia-tesla-k80标签的节点上运行。

12.2.3 发展趋势

发展趋势如下。

◎ GPU和其他设备将像CPU那样成为Kubernetes系统的原生计算资源类型,以Device Plugin的方式供kubelet调用。

◎ 目前的API限制较多,Kubernetes未来会有功能更丰富的API,能支持以可扩展的形式进行GPU等硬件加速器资源的供给、调度和使用。

◎ Kubernetes将能自动确保使用GPU的应用程序达到最佳性能。