NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-03-09 17:51896

评论

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

启新聚势 云谱新篇|海泰方圆与四川联通达成生态战略合作

电子信息发烧客

Unity实战问题-WebGL问题集锦-下篇

芝麻粒儿

android Unity 7月月更

C# 基于MessageBox类的消息对话框讲解

IC00

C# 7月月更

算法题每日一练---第2天:棋盘放麦子

知心宝贝

算法 前端 后端 7月月更

java零基础入门-java8新特性(完结篇)

喵手

Java 7月月更

OneFlow v0.8.0正式发布

OneFlow

版本更新

如何使用 SAP Intelligent Robotic Process Automation 自动操作 Excel

Jerry Wang

机器学习 RPA 机器人流程自动化 SAP 7月月更

STM32+BH1750光敏传感器获取光照强度

DS小龙哥

7月月更

Qt | 通过创建一个简单项目了解Qt Creator

YOLO.

qt Qt Creator 7月月更

mysql进阶(八)排序问题方案探究

No Silver Bullet

MySQL 排序 中文编码 7月月更

拷贝构造函数剖析【C++】

攻城狮杰森

c++ 7月月更 拷贝构造函数

【LeetCode】数组能形成多少数对Java题解

Albert

LeetCode 7月月更

iOS 内存管理(基本概念及引用计数)

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266

小肉球

qt 7月月更

在 IDEA 里下个五子棋不过分吧?

沉默王二

Java Netty IDEA idea插件 idea plugin

LeetCode-101. 对称二叉树(java)

bug菌

Leet Code 7月月更

Linux下玩转nginx系列(七)---nginx如何实现限流功能

anyRTC开发者

nginx Linux 音视频 服务器 限流

Qt|使用Http通讯下载页面实时显示

中国好公民st

qt 7月月更

直播短视频源码——直播短视频源码的开发步骤顺序五步走

开源直播系统源码

软件开发 直播系统源码 开源源码 短视频直播源码

vivo官网APP全机型UI适配方案

vivo互联网技术

App UI

查找——B+树

乔乔

7月月更

Android root相关调研

沃德

android 程序员 7月月更

聚焦数据|海泰方圆直击证券行业数据安全治理建设思路

电子信息发烧客

strcpy()

謓泽

7月月更

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

西柚子

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

小哈区块

h5实现一个刮刮卡的动画效果

南极一块修炼千年的大冰块

7月月更

CSS动画篇之404动画

南城FE

CSS 前端 7月月更

面对复杂问题时,系统思考助你理解问题本质

阿里技术

系统性思考 复杂事件处理 业务逻辑

2022可信区块链生态大会落幕——旺链科技参与《区块链供应链金融系统评测方法》制定

旺链科技

区块链 产业区块链 供应链金融

国际顶会OSDI首度收录淘宝系统论文,端云协同智能获大会主旨演讲推荐

阿里巴巴大淘宝技术

人工智能 #开源

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