我正在使用 keras 混合精度 API 以适应 GPU 中的网络。通常在我的代码中,这看起来像这样。MWE 将是:
from tensorflow.keras.mixed_precision import experimental as mixed_precision
use_mixed_precision = True
if use_mixed_precision:
policy_type = 'mixed_float16'
else:
policy_type = 'float32'
policy = mixed_precision.Policy(policy_type)
mixed_precision.set_policy(policy)
这似乎达到了预期的效果,因为当我训练我的模型并使用 TensorBoard 回调对其进行分析时,我的大部分操作都以半精度运行,其中一些正在使用 TensorCore(我有一个具有计算能力的 GPU 7.0 以上)。
然而,Conv2DBackpropFilter
没有使用 TensorCore,即使根据 TensorBoard 信息它有资格使用它。
我还没有整个事情的最小可重现示例,如果需要,我可以处理它,但我想首先知道这是否是预期的行为,或者是否有一些已知的陷阱,因为我找不到任何网上资料。
编辑
我有一个 MRE,它的行为不同,但问题相同:为什么不使用 TensorCore(所有需要的维度都是 8 的倍数)?
import tensorflow as tf
from tensorflow.keras.mixed_precision import experimental as mixed_precision
use_mixed_precision = True
if use_mixed_precision:
policy_type = 'mixed_float16'
else:
policy_type = 'float32'
policy = mixed_precision.Policy(policy_type)
mixed_precision.set_policy(policy)
nf = 8
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=nf, kernel_size=3, padding='same'),
tf.keras.layers.Conv2D(filters=nf, kernel_size=3, padding='same'),
tf.keras.layers.Conv2D(filters=nf, kernel_size=3, padding='same'),
])
model.compile(loss='mse', optimizer='sgd')
bs = 8
inputs = tf.random.normal([bs, 32, 32, 1])
outputs = tf.random.normal([bs, 32, 32, nf])
tboard_cback = tf.keras.callbacks.TensorBoard(
profile_batch='5, 10',
log_dir='logs',
histogram_freq=0,
write_graph=False,
write_images=False,
)
model.fit(inputs, outputs, callbacks=[tboard_cback], epochs=15)
在这个 MRE 中,64.2% 的操作时间花费在半精度上,这意味着半精度确实正在发生。在我的日志中,我还检查了计算能力:
NFO:tensorflow:Mixed precision compatibility check (mixed_float16): OK
Your GPU will likely run quickly with dtype policy mixed_float16 as it has compute capability of at least 7.0. Your GPU: Tesla V100-SXM2-32GB, compute capability 7.0
然而,没有任何操作(这次不仅仅是Conv2DBackpropFilter
)使用 TensorCore 运行。我不明白为什么。