内容简介:本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.题图摄于北京奥林匹克公园本文介绍vSphere 7内置的Bitfusion功能如何在Kubernetes中使用,让应用使用远端GPU资源。
本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
题图摄于北京奥林匹克公园
本文介绍vSphere 7内置的Bitfusion功能如何在Kubernetes中使用,让应用使用远端GPU资源。
(本文作者系VMware云原生实验室工程师,首发于VMware中国研发中心)
背景介绍
随着 AI 技术的快速发展,越来越多的企业开始将 AI 技术应用到自身业务之中。目前,云端 AI 算力主要由三类 AI 加速器来提供:GPU,FPGA 和 AI ASIC 芯片。这些加速器的优点是性能非常高,缺点是 成本高昂,缺少异构加速管理和调度。大部分企业因无法构建高效的加速器资源池,而不得不独占式地使用这些昂贵的加速器资源,导致 资源利用率低,成本高。
以 GPU 为例,通过创新的 Bitfusion GPU 虚拟化技术,能够帮助用户无需任务修改就能透明地共享和使用数据中心内任何服务器之上的 AI加速器,不但能够帮助用户提高资源利用率,而且可以 极大便利 AI 应用的部署,构建数据中心级的 AI 加速器资源池。
Bitfusion通过提供远程GPU池来帮助解决这些问题。Bitfusion使GPU成为头等公民,可以像传统的计算资源一样抽象、分区、自动化和共享。另一方面,Kubernetes已经成为部署和管理机器学习负载的平台。
本文通过介绍使用最新开发的Bitfusion Device Plugin,如何快捷在Kubernetes上使用Bitfusion提供的GPU资源池进TensorFlow行流行的TensorFlow深度学习开发。
概念理解
先来简要介绍一下kubernetes这两个模块:
Extended Resource : 一种自定义资源扩展的方式,将资源的名称和总数量上报给API server,而Scheduler则根据使用该资源pod的创建和删除,做资源可用量的加减法,进而在调度时刻判断是否有满足资源条件的节点。目前这里的Extended Resource的增加和减少单元必须是整数,比如你可以分配1个GPU,但是不能分配0.5个GPU。该功能由于只是替代了Opaque integer resources,做了些更名的工作,所以在1.8已经是稳定的状态了。
Device Plugin :通过提供通用设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,无需修改Kubelet主干代码,就可以实现支持GPU、FPGA、高性能 NIC、InfiniBand 等各种设备的扩展。该能力在Kubernetes 1.8和1.9版本处于Alpha版本,在1.10会进入Beta版本。需要通过feature gate打开, 即配置 –feature-gates=DevicePlugins=true
如图所示,目前我们的处理层在通过device plugin控制单反方面做pod的资源控制,然后由pod内的Bitfusion Client 和 Bitfusion Server 在CUDA driver级别进行交互,在BitfusionClient的软件堆栈中有一个CUDA driver的代理,通过它截获Client上的所有CUDA服务访问,通过网络将数据和服务请求发送给BitfusionServer进行处理。
Bitfusion Device Plugin安装及使用步骤
以下例子以Kubernetes v1.17.5和Ubuntu 18.04作为安装环境,阐述Bitfusion Device Plugin搭建TensorFlow环境进行Benchmarks测试。目前项目及容器镜像托管在研发内部服务器。如无法访问,可通过VMware客户代表联系我们。
首先我们下载Bitfusion Device Plugin项目
目前项目的代码以及bitfusion-base暂时未公开,可通过联系我们或者客户代表获得。获得后,可继续执行下面操作。
我们需要先构建 Device Plugin 的docker image 由于想知道该平台的一个整体性能,所以想要跑些Benchmarks,可以从我们提供的 Dockerfile 中构建Docker image:
docker build -f bitfusion-device-plugin/Dockerfile -t bitfusion_device_plugin/bitfusion-device:v0.1
FROM bitfusion-base:v0.1 RUN apt install curl -y RUN \ mkdir -p /goroot && \ curl https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | tar xvzf - -C /goroot --strip-components=1 # Set environment variables. ENV GOROOT /goroot ENV GOPATH /gopath ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH # Define working directory. WORKDIR /gopath/src/bitfusion-device-plugin COPY . . RUN go build -o bitfusion-device-plugin RUN cp bitfusion-device-plugin /usr/bin/bitfusion-device-plugin \ && cp *.sh /usr/bin CMD ["./start.sh"]
然后配置Bitfusion Device Plugin的yaml文件
Bitfusion Device Plugin 是符合 Kubernetes device plugin 接口规范的设备扩展插件。可以无缝地在一个 Kubernetes 集群里添加 bitfusion.io/gpu资源,从而在部署应用的时候,在容器中使用 bitfusion。
修改如下,更新 device_plugin.yml 文件中的 image ,Device Plugin 将以 DaemonSet 安装在Kubernetes 节点上。
apiVersion: apps/v1 kind: DaemonSet metadata: name: bitfusion-cli-device-plugin namespace: kube-system labels: tier: node spec: hostNetwork: true containers: - name: device-plugin-ctr image: bitfusion_device_plugin/bitfusion-device:v0.1 securityContext: privileged: true command: ["./start.sh"] env: - name: REG_EXP_SFC valueFrom: configMapKeyRef: name: configmap key: reg-exp - name: SOCKET_NAME valueFrom: configMapKeyRef: name: configmap key: socket-name - name: RESOURCE_NAME valueFrom: configMapKeyRef: name: configmap key: resource-name volumeMounts: - mountPath: "/root/.bitfusion" name: bitfusion-cli - mountPath: /gopath/run name: docker - mountPath: /gopath/proc name: proc - mountPath: "/root/.ssh/id_rsa" name: ssh-key - mountPath: "/var/lib/kubelet" name: kubelet-socket - mountPath: "/etc/kubernetes/pki" name: pki volumes: - name: bitfusion-cli hostPath: path: "/root/.bitfusion" - name: docker hostPath: path: /var/run - name: proc hostPath: path: /proc - hostPath: path: "/root/.ssh/id_rsa" name: ssh-key - hostPath: path: "/var/lib/kubelet" name: kubelet-socket - hostPath: path: "/etc/kubernetes/pki" name: pki
然后使用以下命令进行部署:
kubeclt apply -f bitfusion-device-plugin/device_plugin.yml
执行完成后,等待一段时间,如果成功部署,可以看到Bitfusion Device Plugin 的状态为Running,日志打印出当前device-plugin的状态
构建TensorFlow image进行Benchmarks测试
我们已经提供了bitfusion-base镜像,以及构建好的bitfusion-tfl-cli镜像,可以直接拉取使用,或者按照需求自行构建。
docker build -f bitfusion-device-plugin/docker/bitfusion-tfl-cli/Dockerfile -t bitfusion-tfl-cli:v0.1
FROM bitfusion-base:v0.1 RUN conda install tensorflow-gpu==1.13.1
在 pod.yaml 中添加标签,并且参考如下修改 参数:
resource limit:可以设置应用能使用的 bitfusion.io/gpu 的数目;
配置 pod bitfusion-device-plugin/example/pod/pod.yaml
--- apiVersion: v1 kind: ConfigMap metadata: name: bfs-pod-configmap --- apiVersion: v1 kind: Pod metadata: name: bfs-demo labels: purpose: device-demo spec: hostNetwork: true containers: - name: demo image: bitfusion-tfl-cli:v0.1 imagePullPolicy: Always workingDir: /root securityContext: privileged: true command: ["/bin/bash", "-c", "--"] args: ["python /benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --local_parameter_device=gpu --batch_size=32 --model=inception3 "] volumeMounts: - mountPath: "/root/.bitfusion" name: config-volume resources: limits: bitfusion.io/gpu: 1 volumes: - name: config-volume hostPath: path: "/root/.bitfusion"
Kubernetes上跑TensorFlow的benchmark进行测试
TensorFlow有自己的官方Benchmarks: tensorflow/benchmarks ,里面的tf_cnn_benchmarks包含了resnet50, resnet152, inception3, vgg16, googlenet, alexnet等模型,只需要简单地提供一些参数,便可开始测试。
这里我们选择inception3模型来做基准测试,观察pod内的bitfusion client 是否成功和bitfusion server打通
kubeclt apply -f bitfusion-device-plugin/example/pod/pod.yaml
执行完之后,等待一段时间,default 项目中可以看到 bfs-demo 的 Pod。
如果部署成功, Pod的log显示:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Apache Hadoop运行深度学习
- Submarine:在 Apache Hadoop 中运行深度学习框架
- 在Windows的Ubuntu子系统运行支持CUDA的深度学习代码
- 英特尔开源分布式深度学习平台 Nauta,使用 Kubernetes 和 Docker 平台运行
- 运行过程+运行效率
- dotnet 判断程序当前使用管理员运行降低权使用普通权限运行
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。