写点什么

GPU 在 Docker/K8S/TensorFlow 的应用以及实操经验

  • 2020-03-09
  • 本文字数:3982 字

    阅读完需:约 13 分钟

GPU 在 Docker/K8S/TensorFlow 的应用以及实操经验

据悉,Kubernetes 上游计划在其 1.6 发行版本中加入 GPU 功能,提升应用程序运行效率。因为很多应用使用 GPU 可以提升效率,比如,大数据平台应用 TensorFlow 通过使用 GPU 效率可以提升几十甚至几百倍。

那么,GPU 是如何应用在 Docker/K8S/TensorFlow 这些平台上起到提升效率的作用的?本文由才云新晋大将 赵慧智 整理编写。主要描写了 GPU 在 Docker、Kubernetes、TensorFlow 以及 Kubernetes+TensorFlow 领域的应用,并介绍了在开发领域自己的实践经验,希望给大家带来借鉴和指导意义。

作者简介:


赵慧智,2016 年下旬加入才云,前 HPE 的 Container team 的 Tech Lead,Kubernetes Member,在软件研发领域有 10 多年的经验。曾在 HP 和 HPE 工作五年多,先前负责过 Linux Kernel 及 driver 开发,后负责 Container 在 HPE Server 上的性能及团队管理工作,之后负责 Kubernetes/Mesos 在 HPE 服务器上的硬件 enablement 及开源工作。

为什么离开惠普,加入才云

2016 年下旬,前惠普 Kubernetes 技术领域的 GPU 专家赵慧智加盟才云。说起自己加入才云的原因,赵慧智从国内 Kubernetes 现状、未来发展趋势几个方面大致说了一下:“当时自己对 Kubernetes 有很多想法,觉得在云平台里面其实有很多有意思的事情。


比方说,如何提供稳定的中间层来让企业的业务更加的稳定和安全;如何降低硬件的成本;如何应对业务的突飞猛进和弹性支持,诸如此类。一开始喜欢 Kubernetes,觉得在这两个技术以后将在技术领域大有作为。


在技术领域,了解到才云研发实力很强,并且在 Kubernetes 里面有影响力,来到公司体验之后感觉工作氛围很好,于是就过来了。

对于 Kubernetes 1.6 中 GPU 功能的想法

赵慧智说:“关于 Kubernetes 1.6,我是希望把 GPU 的功能加进去,因为目前很多应用都能在 GPU 上跑出比 CPU 高很多的性能,而在云里面一个很好的地方是通用化,例如一个应用迁移到另外一个 VM 或者 Server 上可以继续运行,但是通用化也导致了一些硬件特性被屏蔽了,GPU 就是其中之一,所以在 Kubernetes 这样一种 container 编排的环境中如果能支持 GPU,那么将会对一些应用的性能产生质的影响,例如深度学习、AI 等。”


以下是赵慧智 GPU 分享具体内容:

GPU

图形处理器(英语:graphics processing unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。



(图为:从最初的 GEFORCE 6600 GT 到 K80 的多 GPU 卡协同工作)


GPU 最大的好处就在于可以通过远远多于 CPU 的 core 数量来达到并行计算。

CUDA

CUDA(Compute Unified Device Architecture,统一计算架构)是由 NVIDIA 所推出的一种集成技术,是该公司对于 GPGPU 的正式名称。通过这个技术,用户可利用 NVIDIA 的 GeForce 8 以后的 GPU 和较新的 QuadroGPU 进行计算。亦是首次可以利用 GPU 作为 C- 编译器的开发环境。NVIDIA 营销的时候,往往将编译器与架构混合推广,造成混乱。实际上,CUDA 可以兼容 OpenCL 或者 NVIDIA 的 C- 编译器。



(上图为 CUDA 编程的基本逻辑)


CUDA 提供了对于一般性通用需求的大规模并发编程模型,使用户可以对 NVIDIA GPU 方便的对于 GPU 进行并发性编程。CUDA 编程模型与传统编程模型比较:样例:将数组 a 与数组 b 相加,并将结果赋值给 c


传统方式:



数组会按照从 a[0] + b[0] 一直顺序执行到 a[n] + b[n]。

多核计算方式:


如果进行编译优化会在特定操作系统里面把这个数组的相加分配到不同的 core 里面执行,这样所有的计算就会按照 core 的数量进行并发,那么我们可以看到在数组操作中,效率的高低取决于 core 的多少。而通常个人的计算机一般会有 2-8 个 core 不等,而大部分服务器也很少会超过 100 个 core。然而,一个 GPU 很容易就可以达到上千个 core,这样在进行并行计算的时候可以实现十几甚至上百上千倍的效率提升。而 GPU 的价格远远低于相同个数 core 的 CPU(多个)的价格。既然 CUDA 可以提供一般性的并发编程模型,那么我们来看看在 CUDA 平台上上面的代码该怎么写。

代码示例:


申请一块 GPU 的内存,然后就可以把所有的并发操作都交给 GPU。

GPU in Docker

关键词:–device


Docker 是具有把 device 通过 cgroup 里面的 deivce 来 mapping 到 container 上的能力的,我们可以通过“–device”来达到这个目的。


docker run -it --device/dev/nvidia0:/dev/nvidia0 \     // 第 1 个 Nvidia 卡       --device /dev/nvidia1:/dev/nvidia1 \              // 第二个 Nvidia 卡       --device /dev/nvidiactl:/dev/nvidiactl \           // 这个是作为 Nvidia 操作的必须 mount 的设备       --device /dev/nvidia-uvm:/dev/nvidia-uvm \ // 这个是作为 Nvidia 操作的必须 mount 的设备       tf-cuda:v1.1beta/bin/bash
复制代码


然后我们可以通过 “docker inspect:” 来检查 container 所指定的设备。



然后我们在 container 的内部就可以看到相应的设备并且可以使用了。


在设备已经可以绑定了之后,我们就可以提供 driver 和 CUDA 的支持了,而 Nvidia 给了一个关于如何在 container 层面支持 GPU 的原型,是基于 Docker 的,叫做 Nvidia Docker。


Nvidia Docker 所提供的功能:


Volume: Nvidia driver/NVML tools.Assign GPUs to container automatically.Basic cuda container build.Multi-platform environment.
复制代码



支持 GPU 的 container 在 Nvidia Docker 里面的层级关系。


目前我们已经支持了如何在 container 的层面支持 GPU,但是这还远远不够在 container 编排环境里面支持 GPU,譬如我们在 Kubernetes 里面支持 GPU。

GPU in K8S:

在 Kubernetes 里面我们做一些关于 GPU 的工作才能让 GPU 能够被调度起来,功能如下:


GPU discovery.(kubelet):加入这个功能是为了能够让 Kubelet 在启动的同时就可以查找本机上的 GPU,而这个 GPU 消息可以发送给 apiserver,但 apiserver 里面有 GPU 的信息后,就可以通过 kube-scheduler 进行调度了。


GPUassignment/release. (kubelet):当一个 container 存在 GPU 需求的时候,我们可以通过 docker 的 --device 层面来支持对于 GPU 的 assign 和 release Resource API.(kube-apiserver/kube-scheduler):在 kube-scheduler 和 kubelet 之间需要一个关于 GPU 资源的协议支持,譬如目前有 CPU,memory 等,为了让 GPU 能够被调度,我们需要引入 GPU 作为一个资源可以被调度。

GPU in TensorFlow:

在分布式 TensorFlow 环境里面,各个 worker 不互相通信,只会跟 parameter server 通信。所以即使将各个 worker 部署到不同的机器上也不会造成性能损耗。目前 TensorFlow 支持 GPU 进行 training 的运算,但需要进行编译时设置。


GPU in K8S + TensorFlow

由于在部署分布式 TensorFlow 时极其繁琐,并且在每次扩容都需要进行很多设置和操作。所以提供基于容器化的 TensorFlow 并运行在 Kubernetes 上就使其变得相当容易,而我们需要做的,就是在上面提到的如何让 Kubernetes 支持 GPU 的情况下,将 TensorFlow 容器化。



本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/j8hcEjDvRGhvTGCc30mA6w


2020-03-09 17:511353

评论

发布
暂无评论
发现更多内容

CPU战争40年,终于把Intel打趴下了

爱好编程进阶

Java 程序员 后端开发

Dubbo

爱好编程进阶

程序员 后端开发

Fluid 0

爱好编程进阶

Java 程序员 后端开发

JavaScript class类的基本使用方法你知道吗

CRMEB

购买自助洗车机时都要注意哪些

共享电单车厂家

自助洗车机多少钱 自助洗车机价格 自助洗车加盟 购买自助洗车机

python好用的函数或库

AIWeker

Python 人工智能 5月月更

全球云服务支出持续攀升,中国云安全市场进入黄金期

行云管家

云计算 网络安全 公有云 云服务 云平台

如何制作网站的在线帮助中心

小炮

帮助中心

揭秘百度智能测试在测试自动生成领域的探索

百度Geek说

测试

Eclipse+Java+Swing实现企业人事管理系统

爱好编程进阶

Java 程序员 后端开发

第1章-Spring的模块与应用场景

码匠

Java Spring Framework

Day269

爱好编程进阶

Java 程序员 后端开发

Dubbo中的统一契约是如何实现的?

爱好编程进阶

Java 程序员 后端开发

GitHub上标星120K,Alibaba官网发布了这份Java全栈知识体系手册

爱好编程进阶

Java 程序员 后端开发

龙蜥正式开源 SysOM:百万级实战经验打造!一站式运维管理平台 | 龙蜥技术

OpenAnolis小助手

开源 操作系统 龙蜥社区 SysOM 系统运维SIG

【国产免费】分布式作业批处理ETL平台TASKCTL变量属性设置

敏捷调度TASKCTL

大数据 DevOps 分布式 自动化运维 TASKCTL

Cloud-借助消息队列解决分布式事务

爱好编程进阶

Java 程序员

Eclipse+Java+Swing实现仓库管理系统

爱好编程进阶

Java 程序员 后端开发

手把手带你用Zabbix进行操作系统监控

博文视点Broadview

CentOS7 部署 LAMP 平台与应用

爱好编程进阶

Java 程序员 后端开发

ElasticSearch三节点集群搭建笔记(中心化版本)

爱好编程进阶

程序员 后端开发

final的两个重排序规则

爱好编程进阶

程序员 后端开发

5分钟速览证券行业财富管理转型新趋势

易观分析

证券市场

服务器运维省钱省事省心安全就用行云管家!

行云管家

服务器 行云管家 服务器运维

FPGA(3)--VHDL及原理图--4位全加器

爱好编程进阶

程序员 后端开发

中国联通改造 Apache DolphinScheduler 资源中心,实现计费环境跨集群调用与数据脚本一站式访问

白鲸开源

大数据 开源 Apache DolphinScheduler workflow apache 社区

给大家科普下如何加盟自助洗车

共享电单车厂家

自助洗车加盟 自助洗车怎么加盟 如何加盟自助洗车

墨天轮最受DBA欢迎的数据库技术文档-SQL优化篇

墨天轮

MySQL 数据库 oracle postgresql

CentOS安装MySQL详解

爱好编程进阶

Java 程序员 后端开发

Day461

爱好编程进阶

程序员 后端开发

Github首次开放,一天遭狂转 50w 次,大厂内部不外传的 100 万字 Java 面试手册

爱好编程进阶

Java 程序员 后端开发

GPU 在 Docker/K8S/TensorFlow 的应用以及实操经验_文化 & 方法_才云科技_InfoQ精选文章