tensorflow - Tensorflow 新版本中的 tf.contrib.nccl.allsum 是什么?
问题描述
好像从tensorflow 1.13开始,就没有tf.contrib.nccl.allsum之类的api了。然而,在 Nvidia 官方 GitHub https://github.com/tkarras/progressive_growth_of_gans中,它使用这个旧 API 来减少来自不同 gpu 设备的总和,如下所示。
# Sum gradients across devices.
if len(devices) > 1:
with tf.name_scope('SumAcrossGPUs'), tf.device(None):
for var_idx, grad_shape in enumerate(self._grad_shapes):
g = [dev_grads[dev][var_idx][0] for dev in devices]
if np.prod(grad_shape): # nccl does not support zero-sized tensors
g = tf.contrib.nccl.all_sum(g)
for dev, gg in zip(devices, g):
dev_grads[dev][var_idx] = (gg, dev_grads[dev][var_idx][1])
我不确定是否有类似的 api 可以跨不同设备实现相同的集体操作。我查看了 Tensorflow 官方网站,似乎程序员更喜欢使用tf.distribute.MirroredStrategy
隐藏NCCL
. 非常感谢。
解决方案
我认为相同的 API 是nccl_ops.all_sum
. 我已经通过以下代码演示了这个 API。
import tensorflow as tf
from tensorflow.python.ops import nccl_ops
a = []
with tf.device("/GPU:0"):
g = tf.constant([1,1])
print(g)
a.append(g)
with tf.device("/GPU:1"):
g = tf.constant([2,2])
a.append(g)
b = nccl_ops.all_sum(a)
with tf.Session() as sess:
print(sess.run(b))
我不确定 tensorflow 团队将来会做什么。但是现在我们可以用它来做集体操作。
推荐阅读
- python - 提供 REST 端点以列出模型字段的唯一值
- javascript - 内部json数组无法在javascript中访问,但可以控制台记录完整的json
- android - Android - 前台在 Oreo 中不起作用。操作系统在一段时间后终止服务
- css - 用两种不同的颜色画一条线,一种在中心,另一种在边缘
- sql - LISTAGG in WHERE 子句
- node.js - 我如何 npm 安装 node-gmail-api?
- node.js - node.js keycloak 中的策略执行
- c# - 端口权限不足
- arrays - 将给定值分布在给定长度的数组上
- c++ - 从 MSMQ 检索结构并将其转换回 C++ 中的结构格式