资讯专栏INFORMATION COLUMN

TensorFlow 指南:GPU 的使用

Leo_chen / 3631人阅读

摘要:大家好,今天我们来给讲讲关于在中的使用规则。在某些情况下,最理想的是进程只分配可用内存的一个子集,或者仅根据进程需要增加内存使用量。

大家好,今天我们来给讲讲关于 TensorFlow 在 GPU 中的使用规则。

支持的设备

在一套标准系统中通常有多台计算设备。TensorFlow 支持 CPU 和 GPU 这两种设备。它们均用 strings 表示。例如:

"/cpu:0":机器的 CPU

"/device:GPU:0":机器的 GPU(如果有一个)

"/device:GPU:1":机器的第二个 GPU(以此类推)

如果 TensorFlow 指令中兼有 CPU 和 GPU 实现,当该指令分配到设备时,GPU 设备有优先权。例如,如果 matmul 同时存在 CPU 和 GPU 核函数,在同时有 cpu:0 和 gpu:0 设备的系统中,gpu:0 会被选来运行 matmul。

记录设备分配方式

要找出您的指令和张量被分配到哪个设备,请创建会话并将 log_device_placement 配置选项设为 True。

# Creates a 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)

# Creates a session with log_device_placement set to True.

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

# Runs the op.

print(sess.run(c))

您应该会看到以下输出内容:

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus

id: 0000:05:00.0

b: /job:localhost/replica:0/task:0/device:GPU:0

a: /job:localhost/replica:0/task:0/device:GPU:0

MatMul: /job:localhost/replica:0/task:0/device:GPU:0

[[ 22.  28.]

 [ 49.  64.]]

手动分配设备

如果您希望特定指令在您选择的设备(而非系统自动为您选择的设备)上运行,您可以使用 with tf.device 创建设备上下文,这个上下文中的所有指令都将被分配在同一个设备上运行。

# Creates a 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)

# Creates a session with log_device_placement set to True.

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

# Runs the op.

print(sess.run(c))

您会看到现在 a 和 b 被分配到 cpu:0。由于未明确指定运行 MatMul 指令的设备,因此 TensorFlow 运行时将根据指令和可用设备(此示例中的 gpu:0)选择一个设备,并会根据要求自动复制设备间的张量。

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus

id: 0000:05:00.0

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/device:GPU:0

[[ 22.  28.]

 [ 49.  64.]]

允许增加 GPU 内存

默认情况下,TensorFlow 会映射进程可见的所有 GPU 的几乎所有 GPU 内存(取决于 CUDA_VISIBLE_DEVICES)。通过减少内存碎片,可以更有效地使用设备上相对宝贵的 GPU 内存资源。

在某些情况下,最理想的是进程只分配可用内存的一个子集,或者仅根据进程需要增加内存使用量。TensorFlow 在 Session 上提供两个 Config 选项来进行控制。

第一个是 allow_growth 选项,它试图根据运行时的需要来分配 GPU 内存:它刚开始分配很少的内存,随着 Session 开始运行并需要更多 GPU 内存,我们会扩展 TensorFlow 进程所需的 GPU 内存区域。请注意,我们不会释放内存,因为这可能导致出现更严重的内存碎片情况。要开启此选项,请通过以下方式在 ConfigProto 中设置选项:

config = tf.ConfigProto()

config.gpu_options.allow_growth = True

session = tf.Session(config=config, ...)

如要真正限制 TensorFlow 进程可使用的 GPU 内存量,这非常实用。

在多 GPU 系统中使用单一 GPU

如果您的系统中有多个 GPU,则默认情况下将选择 ID 最小的 GPU。如果您希望在其他 GPU 上运行,则需要显式指定偏好设置:

# Creates a graph.

with tf.device("/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)

# Creates a session with log_device_placement set to True.

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

# Runs the op.

print(sess.run(c))

如果您指定的设备不存在,您会看到 InvalidArgumentError:

InvalidArgumentError: Invalid argument: Cannot assign a device to node "b":

Could not satisfy explicit device specification "/device:GPU:2"

   [[Node: b = Const[dtype=DT_FLOAT, value=Tensor

   values: 1 2 3...>, _device="/device:GPU:2"]()]]

当指定设备不存在时,如果您希望 TensorFlow 自动选择现有的受支持设备来运行指令,则可以在创建会话时将配置选项中的 allow_soft_placement 设为 True。

# Creates a graph.

with tf.device("/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)

# Creates a session with allow_soft_placement and log_device_placement set

# to True.

sess = tf.Session(config=tf.ConfigProto(

      allow_soft_placement=True, log_device_placement=True))

# Runs the op.

print(sess.run(c))

使用多个 GPU

如果您想要在多个 GPU 上运行 TensorFlow,则可以采用多塔式方式构建模型,其中每个塔都会分配给不同 GPU。例如:

# Creates a graph.

c = []

for d in ["/device:GPU:2", "/device: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)

# Creates a session with log_device_placement set to True.

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

# Runs the op.

print(sess.run(sum))

您会看到以下输出内容:

Device mapping:

/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K20m, pci bus

id: 0000:02:00.0

/job:localhost/replica:0/task:0/device:GPU:1 -> device: 1, name: Tesla K20m, pci bus

id: 0000:03:00.0

/job:localhost/replica:0/task:0/device:GPU:2 -> device: 2, name: Tesla K20m, pci bus

id: 0000:83:00.0

/job:localhost/replica:0/task:0/device:GPU:3 -> device: 3, name: Tesla K20m, pci bus

id: 0000:84:00.0

Const_3: /job:localhost/replica:0/task:0/device:GPU:3

Const_2: /job:localhost/replica:0/task:0/device:GPU:3

MatMul_1: /job:localhost/replica:0/task:0/device:GPU:3

Const_1: /job:localhost/replica:0/task:0/device:GPU:2

Const: /job:localhost/replica:0/task:0/device:GPU:2

MatMul: /job:localhost/replica:0/task:0/device:GPU:2

AddN: /job:localhost/replica:0/task:0/cpu:0

[[  44.   56.]

 [  98.  128.]]

cifar10 教程 就是个很好的例子(https://tensorflow.google.cn/tutorials/images/deep_cnn?hl=zh-CN),演示了如何使用多个 GPU 进行训练。

声明:文章收集于网络,如有侵权,请联系小编及时处理,谢谢!

欢迎加入本站公开兴趣群

商业智能与数据分析群

兴趣范围包括各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识

QQ群:81035754

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/4839.html

相关文章

  • GPU云主机 UHost】产品简介、产品优势、机型与性能和深度学习指南

    摘要:云主机产品简介增强型云主机是基于成熟的云计算技术,专享高性能硬件的云主机服务。目前提供采用采用和采用机型。支持多种操作系统增强型云主机支持多种操作系统,如等,以适应不同行业的专业软件及建模需求。机型与性能型可选颗。GPU云主机UHost产品简介GPU增强型云主机是基于UCloud成熟的云计算技术,专享高性能GPU硬件的云主机服务。大幅提升图形图像处理和高性能计算能力,并具备弹性、低成本、易于...

    Tecode 评论0 收藏0
  • 喜大普奔!TensorFlow终于支持A卡了

    摘要:工资不涨,英伟达的售价年年涨。近日,宣布推出适用于的,其中包括。对于正在进行的深度学习加速工作而言,这是一座重大的里程碑。而实现则使用了,这是一个适用于深度学习的高度优化例程库。目前已发布安装说明及预构建的映像。 工资不涨,英伟达 GPU 的售价年年涨。因此,多一个竞争对手,总是好事。近日,Google 宣布推出适用于 ROCm GPU 的 TensorFlow v1.8,其中包括 Rade...

    Cristalven 评论0 收藏0
  • 概览 AI在线服务 UAI Inference

    摘要:概览概览产品简介基础知识产品优势机制产品架构设计原理弹性扩缩容机制开发综述服务请求方式开源镜像开源案例学习视频产品定价快速上手快速上手案例介绍环境准备在线服务代码简介 概览产品简介UAI-Inference基础知识产品优势Hot-Standby机制产品架构设计原理弹性扩缩容机制开发综述服务请求方式开源Docker镜像开源案例学习视频产品定价快速上手快速上手(TF-Mnist案例)MNIST ...

    ernest.wang 评论0 收藏1403
  • PyTorch和TensorFlow到底哪个更好?看看一线开发者怎么说

    摘要:我认为对机器学习开发者来说,是一个了不起的工具集。这个帖子发出后得到了很多机器学习研究者和开发者的关注,他们纷纷跟贴谈论自己的想法和经验不只是关于和,讨论中还涉及到更多工具。 Theano、TensorFlow、Torch、MXNet 再到近日比较热门的 PyTorch 等等,深度学习框架之间的比较一直以来都是非常受人关注的热点话题。机器之心也曾发表过多篇相关的介绍和对比文章,如《主流深度学...

    coordinate35 评论0 收藏0
  • Google Coral Edge TPU USB加速棒上手体验

    摘要:谷歌在年国际消费电子展以及今年的开发峰会上首次展示了他们的,然后于三月份发布了。树莓派上性能的局限性不幸的是,业余爱好者最喜欢树莓派无法充分发挥加速器的功能和速度。使用端口,目前的树莓派设备没有或,而只能使用速度较慢的。 Edge AI是什么?它为何如此重要? 传统意义上,AI解决方案需要强大的并行计算处理能力,长期以来,AI服务都是通过联网在线的云端基于服务器的计算来提供服务。但是具...

    hiyayiji 评论0 收藏0

发表评论

0条评论

Leo_chen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<