怎么导入gpu版本的tensorflow gpu版本

win10下用docker安装tensorflow,怎么调用gpu来训练tensorflow的示例? - 知乎25被浏览6484分享邀请回答该回答已被折叠 01 条评论分享收藏感谢收起TensorFlow GPU | 我爱自然语言处理极客学院团队出品 · 更新于
支持的设备
在一套标准的系统上通常有多个计算设备. TensorFlow 支持 CPU 和 GPU 这两种设备. 我们用指定字符串
strings 来标识这些设备. 比如:
"/cpu:0": 机器中的 CPU
"/gpu:0": 机器中的 GPU, 如果你有一个的话.
"/gpu:1": 机器中的第二个 GPU, 以此类推...
如果一个 TensorFlow 的 operation 中兼有 CPU 和 GPU 的实现, 当这个算子被指派设备时, GPU 有优先权. 比如matmul中 CPU
和 GPU kernel 函数都存在. 那么在 cpu:0 和 gpu:0 中, matmul operation 会被指派给 gpu:0 .
记录设备指派情况
为了获取你的 operations 和 Tensor 被指派到哪个设备上运行, 用 log_device_placement 新建一个 session, 并设置为 True.
# 新建一个 graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 新建session with log_device_placement并设置为True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# 运行这个 op.
print sess.run(c)
你应该能看见以下输出:
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: Tesla K40c, pci bus
b: /job:localhost/replica:0/task:0/gpu:0
a: /job:localhost/replica:0/task:0/gpu:0
MatMul: /job:localhost/replica:0/task:0/gpu:0
手工指派设备
如果你不想使用系统来为 operation 指派设备, 而是手工指派设备, 你可以用 with tf.device
创建一个设备环境, 这个环境下的 operation 都统一运行在环境指定的设备上.
# 新建一个graph.
with tf.device('/cpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 新建session with log_device_placement并设置为True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# 运行这个op.
print sess.run(c)
你会发现现在 a 和 b 操作都被指派给了 cpu:0.
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: Tesla K40c, pci bus
b: /job:localhost/replica:0/task:0/cpu:0
a: /job:localhost/replica:0/task:0/cpu:0
MatMul: /job:localhost/replica:0/task:0/gpu:0
在多GPU系统里使用单一GPU
如果你的系统里有多个 GPU, 那么 ID 最小的 GPU 会默认使用. 如果你想用别的 GPU, 可以用下面的方法显式的声明你的偏好:
# 新建一个 graph.
with tf.device('/gpu:2'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 新建 session with log_device_placement 并设置为 True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# 运行这个 op.
print sess.run(c)
如果你指定的设备不存在, 你会收到 InvalidArgumentError 错误提示:
InvalidArgumentError: Invalid argument: Cannot assign a device to node 'b':
Could not satisfy explicit device specification '/gpu:2'
[[Node: b = Const[dtype=DT_FLOAT, value=Tensor&type: float shape: [3,2]
values: 1 2 3...&, _device="/gpu:2"]()]]
为了避免出现你指定的设备不存在这种情况, 你可以在创建的 session 里把参数 allow_soft_placement 设置为 True, 这样 tensorFlow 会自动选择一个存在并且支持的设备来运行 operation.
# 新建一个 graph.
with tf.device('/gpu:2'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 新建 session with log_device_placement 并设置为 True.
sess = tf.Session(config=tf.ConfigProto(
allow_soft_placement=True, log_device_placement=True))
# 运行这个 op.
print sess.run(c)
使用多个 GPU
如果你想让 TensorFlow 在多个 GPU 上运行, 你可以建立 multi-tower 结构, 在这个结构
里每个 tower 分别被指配给不同的 GPU 运行. 比如:
# 新建一个 graph.
for d in ['/gpu:2', '/gpu:3']:
with tf.device(d):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
sum = tf.add_n(c)
# 新建session with log_device_placement并设置为True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# 运行这个op.
print sess.run(sum)
你会看到如下输出:
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -& device: 0, name: Tesla K20m, pci bus
/job:localhost/replica:0/task:0/gpu:1 -& device: 1, name: Tesla K20m, pci bus
/job:localhost/replica:0/task:0/gpu:2 -& device: 2, name: Tesla K20m, pci bus
/job:localhost/replica:0/task:0/gpu:3 -& device: 3, name: Tesla K20m, pci bus
Const_3: /job:localhost/replica:0/task:0/gpu:3
Const_2: /job:localhost/replica:0/task:0/gpu:3
MatMul_1: /job:localhost/replica:0/task:0/gpu:3
Const_1: /job:localhost/replica:0/task:0/gpu:2
Const: /job:localhost/replica:0/task:0/gpu:2
MatMul: /job:localhost/replica:0/task:0/gpu:2
AddN: /job:localhost/replica:0/task:0/cpu:0
这个例子很好的演示了怎样用GPU集群训练.
翻译: 校对:才云新晋大神:GPU在Docker/K8S/TensorFlow的应用及实操经验-美通社PR-Newswire
才云新晋大神:GPU在Docker/K8S/TensorFlow的应用及实操经验
才云新晋大神: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里面有影响力,来到公司体验之后感觉工作氛围很好,于是就过来了。”
对于Kubernetes1.6中GPU功能的想法
赵慧智说:“关于Kubernetes1.6,我是希望把GPU的功能加进去,因为目前很多应用都能在GPU上跑出比CPU高很多的性能,而在云里面一个很好的地方是通用化,例如一个应用迁移到另外一个VM&或者Server上可以继续运行,但是通用化也导致了一些硬件特性被屏蔽了,GPU就是其中之一,所以在Kubernetes这样一种container编排的环境中如果能支持GPU,那么将会对一些应用的性能产生质的影响,例如深度学习、AI&等。”
以下是赵慧智GPU分享具体内容:
图形处理器(英语:graphics processing unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。
图为:从最初的 GEFORCE 6600 GT到K80的多GPU卡协同工作
GPU最大的好处就在于可以通过远远多于CPU的core数量来达到并行计算。
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 \&&&& // 第一个 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.
目前我们已经支持了如何在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 TensorFlow
GPU in K8S + TensorFlow
由于在部署分布式TensorFlow时极其繁琐,并且在每次扩容都需要进行很多设置和操作。所以提供基于容器化的TensorFlow并运行在Kubernetes上就使其变得相当容易,而我们需要做的,就是在上面提到的如何让Kubernetes支持GPU的情况下,将TensorFlow容器化。
GPU in TensorFlow+K8S
消息来源: 才云Caicloud
扫描二维码分享到微信
相关关键词:
多媒体新闻

我要回帖

更多关于 tensorflow gpu安装 的文章

 

随机推荐