如何使用 Tensorflow 使用自定义损失的分布式训练?

How to use distributed training with a custom loss using Tensorflow?

我有一个 transformer 模型,我想在 Google Cloud AI Platform 上使用 Actor-Critic RL 训练分布在多个工作人员中进行训练。我将我的数据按日期分解成单独的文件并上传到 Cloud Storage。因为我使用的是 Actor-Critic RL,所以我有一个自定义损失函数来计算和应用梯度。我在分布式训练中遇到的所有示例都使用了 model.fit,我无法做到这一点。我一直无法找到有关使用自定义损失的任何信息。

除了在多台机器上分配训练外,我还想知道如何在多个 CPU 核心上正确分配训练。据我了解,model.fit 通常会处理这些问题。

这是自定义损失函数;我相信现在它相当于批量大小 1:

def learn(self, state_value_starting: tf.Tensor, probabilities: tf.Tensor, state_new: tf.Tensor,
            reward: tf.Tensor, is_done: tf.Tensor):
    with tf.GradientTape() as tape:
        state_value_starting = tf.squeeze(state_value_starting)
        state_value_new, _ = self.call(state_new)
        state_value_new = tf.squeeze(state_value_new)

        action_probabilities = tfp.distributions.Categorical(probs=probabilities)
        log_probability = action_probabilities.log_prob(self._last_action)

        delta = reward + (self._discount_factor * state_value_new * (1 - int(is_done))) - state_value_starting
        actor_loss = -log_probability * delta
        critic_loss = delta ** 2
        total_loss = actor_loss + critic_loss

    gradient = tape.gradient(total_loss, self.trainable_variables)
    self.optimizer.apply_gradients(zip(gradient, self.trainable_variables))

Tensorflow Model is provided with a practiced solution, defined in model_lib_v2.py.

见函数train_loop,自定义训练循环构造利用

strategy = tf.compat.v2.distribute.get_strategy() #L501
with strategy.scope():
    training step ...

和函数中的自定义损失 eager_train_step