如何使用 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
。
我有一个 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
。