尝鲜阿里云容器服务Kubernetes, 拥抱Nvidia GPU的新姿势
自从1.8版本开始,Kubernetes已经明确表示要通过统一的设备插件方式支持像Nvidia PU,InfiniBand,FPGA等硬件加速设备,而社区的GPU方案将在1.10全面弃用,并在1.11版本彻底从主干代码移除。
而Kubernetes全新的GPU调度方案基于Nvidia官方的设备插件和nvidia-container-runtime, 和之前社区方案相比,最终用户所要做的配置更少。
基于该方案,客户可以将应用程序利用容器技术构建镜像,结合Kubernetes+GPU运行机器学习,图像处理等高运算密度等任务,无需安装nvidia driver和CUDA,就能实现一键部署和弹性扩缩容等功能。
下面开始体验如何在阿里云容器服务上创建Tesla P4和P100的Kubernetes GPU混部集群,部署和测试Jupyter应用运行TensorFlow。
创建Kubernetes GPU集群
阿里云容器服务Kubernetes 1.9.3目前在已经上线,但是购买按量付费的GPU计算型服务器需要申请ECS工单开通。具体创建过程,可以参考创建Kubernetes集群。
1.首先选择区域
2. 选择实例系列:GPU计算型gn5,通过下拉框可以选择实例规格
3. 勾选开放公网SSH登录,这样就可以通过ssh登录Kubernetes的Master节点
4.当集群创建成功后,点击管理
按钮
5. 这样就可以看到Master节点SSH连接地址
6. 通过ssh登录Master查看包含GPU节点
kubectl get nodes -l 'aliyun.accelerator/nvidia' --show-labels
NAME STATUS ROLES AGE VERSION LABELS
cn-hongkong.i-uf6jd9dgj8kgb5wua461 Ready 2d v1.9.3 aliyun.accelerator/nvidia=Tesla-P100-PCIE-16GB
cn-hongkong.i-uf6jd9dgj8kgbhr0yg35 Ready 2d v1.9.3 aliyun.accelerator/nvidia=Tesla-P4
这样就可以通过label: aliyun.accelerator/nvidia看到GPU类型,在该例子中可以看到这里有两台GPU服务器:Tesla P100和P4。这样在部署应用时,可以利用Node Affinity机制将其调度到指定的GPU型号。
7. 具体查看GPU节点的状态信息
kubectl get node ${node_name} -o=yaml
...
status:
addresses:
- address: 192.168.75.179
type: InternalIP
allocatable:
cpu: "8"
memory: 61578152Ki
nvidia.com/gpu: "1"
pods: "110"
capacity:
cpu: "8"
memory: 61680552Ki
nvidia.com/gpu: "1"
pods: "110"
...
可以看到该节点的含有GPU资源数量为1, 这样我们就可以开始运行使用GPU的TensorFlow应用
运行TensorFLow的GPU实验环境
数据科学家通常习惯使用Jupyter作为TensorFlow实验环境,我们这里可以用一个例子向您展示如何快速部署一个Jupyter应用。
下面的deployment.yaml内容分为两部分: Deployment和Service,
---
# Define the tensorflow deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: tf-notebook
labels:
app: tf-notebook
spec:
replicas: 1
selector: # define how the deployment finds the pods it mangages
matchLabels:
app: tf-notebook
template: # define the pods specifications
metadata:
labels:
app: tf-notebook
spec:
containers:
- name: tf-notebook
image: tensorflow/tensorflow:1.4.1-gpu-py3
resources:
limits:
nvidia.com/gpu: 1
ports:
- containerPort: 8888
hostPort: 8888
env:
- name: PASSWORD
value: mypassw0rd
# Define the tensorflow service
---
apiVersion: v1
kind: Service
metadata:
name: tf-notebook
spec:
ports:
- port: 80
targetPort: 8888
name: jupyter
selector:
app: tf-notebook
type: LoadBalancer
Deployment配置:
-
nvidia.com/gpu 指定调用nvidia gpu的数量
-
type=LoadBalancer 指定使用阿里云的负载均衡访问内部服务和负载均衡
- 环境变量 PASSWORD 指定了访问Jupyter服务的密码,您可以按照您的需要修改
如果您编写过老的GPU部署方案,会知道过去必须要定义如下的nvidia驱动所在的数据卷。
volumes:
- hostPath:
path: /usr/lib/nvidia-375/bin
name: bin
- hostPath:
path: /usr/lib/nvidia-375
name: lib
这需要您在编写部署文件时,强依赖于所在的集群,导致缺乏可移植性。但是在Kubernetes 1.9.3中,最终用户无需指定这些hostPath,nvidia的插件会自发现驱动所需的库链接和执行文件。
1. 运行kubectl部署该应用:
kubectl create -f deployment.yaml
2. 查看deployment的配置
kubectl get deploy tf-notebook -o=yaml
apiVersion: extensions/v1beta1
...
kind: Deployment
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: tf-notebook
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: tf-notebook
spec:
containers:
- image: tensorflow/tensorflow:1.4.1-gpu-py3
imagePullPolicy: IfNotPresent
name: tf-notebook
ports:
- containerPort: 8888
hostPort: 8888
protocol: TCP
resources:
limits:
nvidia.com/gpu: "1"
3. 查看deployment日志
# kubectl logs $(kubectl get po | awk '{print $1}' |grep tf-notebook)
[I 13:03:19.579 NotebookApp] Writing notebook server COOKIE secret to /root/.local/share/jupyter/runtime/notebook_COOKIE_secret
[W 13:03:19.595 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 13:03:19.604 NotebookApp] Serving notebooks from local directory: /notebooks
[I 13:03:19.604 NotebookApp] 0 active kernels
[I 13:03:19.604 NotebookApp] The Jupyter Notebook is running at:
[I 13:03:19.604 NotebookApp] http://[all ip addresses on your system]:8888/?token=71586cf8ab9fcd6175d489b0e07c7ed3fccd5f6395824e31
[I 13:03:19.604 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 13:03:19.604 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=71586cf8ab9fcd6175d489b0e07c7ed3fccd5f6395824e31
4. 通过service查看访问端点,只需要检查EXTERNAL-IP
kubectl get svc
kubectl get svc tf-notebook
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tf-notebook LoadBalancer 172.19.12.63 139.196.5.196 80:32490/TCP 11m
5. 这样就直接可以访问Jupyter实例,链接是http://EXTERNAL-IP。
现在要验证这个Jupyter实例可以使用GPU,可以在运行下面的程序。它将列出Tensorflow可用的所有设备。
from tensorflow.python.client import device_lib
def get_available_devices():
local_device_protos = device_lib.list_local_devices()
return [x.name for x in local_device_protos]
print(get_available_devices())
可以看到如下输出
这样,您就可以正式开始自己的TensorFlow on GPU之旅
总结
利用阿里云容器服务的Kubernetes,您可以在部署时刻选择GPU类型的工作节点,而无需操心复杂Nvidia驱动和Kubernetes集群配置,一键部署,不出十分钟就可以轻松获得阿里云强大的异构计算能力和Kubernetes的GPU应用部署调度能力。这样您就可以专心的构建和运行自己的深度学习应用了。欢迎您在香港区域尝试和体验,后续我们也会开放其他地区的Kubernetes 1.9.3。