vSphere Bitfusion运行TensorFlow深度学习任务

栏目: IT技术 · 发布时间: 4年前

内容简介:本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.题图摄于北京奥林匹克公园本文介绍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显示:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

可伸缩架构

可伸缩架构

【美】Lee Atchison / 张若飞、张现双 / 电子工业出版社 / 2017-7 / 65

随着互联网的发展越来越成熟,流量和数据量飞速增长,许多公司的关键应用程序都面临着伸缩性的问题,系统变得越来越复杂和脆弱,从而导致风险上升、可用性降低。《可伸缩架构:面向增长应用的高可用》是一本实践指南,让IT、DevOps和系统稳定性管理员能够了解到,如何避免应用程序在发展过程中变得缓慢、数据不一致或者彻底不可用等问题。规模增长并不只意味着处理更多的用户,还包括管理更多的风险和保证系统的可用性。作......一起来看看 《可伸缩架构》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码