2019 年 11 月 15 日 — SYSTRAN 的研究工程师 Guillaume Klein 的客座文章。
OpenNMT-tf 是一个于 2017 年发布的用于 TensorFlow 的神经机器翻译工具包。当时,该项目使用了 TensorFlow 提供的许多功能和能力:使用 tf.estimator
进行训练和评估,变量作用域,图形集合,tf.contrib
等等。我们很高兴能一起使用这些功能超过 2 年。
我们花费了……
tf.estimator
进行训练和评估,变量作用域,图形集合,tf.contrib
等等。我们很高兴能一起使用这些功能超过 2 年。tf.compat.v1
和 tf.compat.v2
在此迭代过程中提供了极大的帮助。tf.estimator
转移,即使这需要对代码进行大量重新设计。幸运的是,我们发现编写自定义训练循环相对容易,同时仍然满足性能要求(使用 tf.function
)并支持高级功能,如多 GPU 训练(使用 tf.distribute
)和混合精度训练(使用自动混合精度图)。@tf.function
def forward(source, target):
"""Forwards a training example into the model, computes the
loss, and accumulates the gradients.
"""
logits = model(source, target, training=True)
loss = model.compute_loss(logits, target)
gradients = optimizer.get_gradients(loss,
model.trainable_variables)
if not accum_gradients:
# Initialize the variables to accumulate the gradients.
accum_gradients.extend([
tf.Variable(tf.zeros_like(gradient),
trainable=False)
for gradient in gradients])
for accum_gradient, step_gradient in
zip(accum_gradients, gradients):
accum_gradient.assign_add(step_gradient)
return loss
步骤@tf.function
def step():
"""Applies the accumulated gradients and advances
the training step."""
grads_and_vars = [
(gradient / accum_steps, variable)
for gradient, variable in zip(accum_gradients,
model.trainable_variables)]
optimizer.apply_gradients(grads_and_vars)
for accum_gradient in accum_gradients:
accum_gradient.assign(tf.zeros_like(accum_gradient))
for i, (source, target) in enumerate(dataset):
forward(source, target)
# Apply gradients every accum_steps examples.
if (i + 1) % accum_steps == 0:
step()
tf.Module
)重构您的模型并使用 tf.train.Checkpoint
来加载和保存 检查点后,您很可能会破坏与现有检查点的兼容性。为了减轻 OpenNMT-tf 中的这一变化,我们在加载时使用此过程静默地转换旧检查点tf.train.load_checkpoint
加载 V1 变量tf.train.Checkpoint
保存 V2 模型tensorflow_addons.seq2seq
模块的维护,该模块是 tf.contrib.seq2seq
的 TensorFlow 2.0 等效项。
2019 年 11 月 15 日 — SYSTRAN 的研究工程师 Guillaume Klein 的客座文章。
OpenNMT-tf 是一个于 2017 年发布的用于 TensorFlow 的神经机器翻译工具包。当时,该项目使用了 TensorFlow 提供的许多功能和能力:使用 tf.estimator 进行训练和评估,变量作用域,图形集合,tf.contrib 等等。我们很高兴能一起使用这些功能超过 2 年。
我们花费了……