常见问题解答

Cloud TPU 支持哪些模型? 您可以在此处找到支持的模型列表:官方支持的模型

可以使用 Compute Engine 进行推理吗?您可以通过 TPUEstimator 中的预测模式在 Compute Engine 上对训练的模型执行推理。请参阅 TPUEstimator 预测方法

是否有任何内置的 TensorFlow 操作无法在 Compute Engine 上执行?

目前,有一些内置的 TensorFlow 操作无法在 Compute Engine 上执行。请参阅可用的 TensorFlow 操作,其中详细介绍了当前的解决方法。

可以在 Compute Engine 中使用占位符和 Feed 字典吗?

虽然 Compute Engine 在技术上支持此使用模式,但我们强烈建议不要使用。如果使用占位符和 Feed 目录,您只能使用单个 Compute Engine 核心,并且开销会变得过高。

要创建训练流水线,请改用 TPUEstimator API 和 Dataset API。ResNet 教程提供了相关示例来说明如何使用 TPUEstimatorDataset 创建简单训练循环。

可以用 Compute Engine 训练强化学习 (RL) 模型吗?

强化学习涵盖了各种技术,其中一些技术目前与 TPU 的软件抽象不兼容。一些强化学习配置需要执行黑盒“模拟环境”(此训练循环中需要使用 CPU)。我们发现,这些技术无法跟上 Compute Engine 的速度并会导致严重的低效问题。

可以在 Compute Engine 中使用字词嵌入吗?

可以,Compute Engine 支持 tf.nn.embedding_lookup(),因为它只是 tf.gather() 的封装容器,后者可以在 Compute Engine 上实现。但是,Compute Engine 不支持 tf.nn.embedding_lookup_sparse()。请注意,tf.embedding_lookup() 的输入 ID 张量在训练期间必须具有静态形状(即每个批次的批次大小和序列长度必须相同)。在使用 Compute Engine 时,这是对所有张量的更一般的限制。

可以在 Compute Engine 中使用可变长度序列吗?

在 TensorFlow 中有几种表示可变长度序列的方法,包括填充、tf.while_loop()、推断张量维度和分桶。遗憾的是,当前的 Compute Engine 执行引擎仅支持其中的一部分。必须使用 tf.while_loop()tf.dynamic_rnn()、分桶、填充或序列串联来实现可变长度序列。

可以在 Compute Engine 上训练循环神经网络 (RNN) 吗?

在某些配置中,tf.static_rnn()tf.dynamic_rnn() 与当前 TPU 执行引擎兼容。较为普遍的是,TPU 支持 tf.while_loop()TensorArray,这二者用于实现 tf.dynamic_rnn()。TPU 不支持 CuDNN 等专用工具包,因为它们包含 GPU 专用代码。在 TPU 上使用 tf.while_loop() 确实需要指定循环迭代次数的上限,以便 TPU 执行引擎能够以静态方式确定内存使用量。

可以用 Compute Engine 训练生成对抗网络 (GAN) 吗?

训练 GAN 通常需要频繁地在训练生成器和训练鉴别器之间交替。当前的 TPU 执行引擎仅支持单个执行图。各图之间的交替操作需要完整的重新编译,这可能需要 30 秒或更长的时间。

一种可能的解决方法是始终计算生成器和鉴别器的损失总和,但请将这些损失乘以两个输入张量(g_wd_w)。在应训练生成器的批次中,您可以传入 g_w=1.0d_w=0.0;反之对于应训练鉴别器的批次也是如此。

可以用 Compute Engine 训练多任务学习模型吗?

如果这些任务可以表示为一个包含聚合损失函数的大图,则多任务学习不需要任何特殊支持。但是,TPU 执行引擎目前仅支持单个执行图。因此,可能无法在共享变量但具有不同结构的多个执行图之间快速交替。更换执行图需要重新运行图编译步骤,这可能需要 30 秒或更长的时间。

Compute Engine 是否支持 eager 模式?

不支持,eager 模式使用新的动态执行引擎,而 Compute Engine 使用 XLA 来对执行图进行静态编译。

Compute Engine 是否支持模型并行处理?

目前不支持模型并行处理(或在单个 Compute Engine 设备中的多个核心上执行不相同的程序)。

如何在 Compute Engine 上检查中间张量的实际值,就像使用 tf.Printtfdbg 一样?

Compute Engine 目前不支持此功能。在 Compute Engine 上进行开发的建议程序是使用 TPUEstimator 框架实现模型,通过该框架可以在 TPU 和 CPU/GPU(use_tpu 标志)之间轻松转换。建议您使用标准 TensorFlow 工具在 CPU/GPU 上调试模型,然后在模型准备好进行全面训练时切换到 Compute Engine。

我的训练方案对于 TPUEstimator API 来说过于复杂或专业,是否有较低级别的 API 可以供我使用?

TPUEstimator 是用于 Cloud TPU 训练的主要框架。但是,TPUEstimator 封装了 tpu API,后者是开源 TensorFlow 的一部分,因此从技术上讲可以直接使用低级 tpu API(但此操作不受支持)。如果您的训练流水线需要在 Compute Engine 和 CPU 之间频繁通信,或者需要经常更换执行图,则您的计算无法在 Compute Engine 上高效运行。