如何将多个 GPU 用于协同工作的多个模型?

Posted

技术标签:

【中文标题】如何将多个 GPU 用于协同工作的多个模型?【英文标题】:How to use multiple GPUs for multiple models that work together? 【发布时间】:2021-12-27 03:37:04 【问题描述】:

我在 tensorflow 的不同设备范围下定义了三个模型,我正在使用 GradientTape 来训练这些网络。当我这样做时,内存会增加几百兆字节,以表明模型已加载到各自的 GPU 中。问题是,当我开始训练时,即使批量非常小,也只有 GPU @位置 0 内存增加。我也在使用 GradientTape 进行培训。有什么方法可以确保只有分配给模型的 GPU 用于该模型?

with tf.device('/device:GPU:0'):
    model1 = model1Class().model()

with tf.device('/device:GPU:1'):
    model2 = model2Class().model()

with tf.device('/device:GPU:2'):
    model3 = model3Class().model()


for epoch in range(10):
    dataGen = DataGenerator(...)
    X, y = next(dataGen)

    with tf.GradientTape() as tape1:
         X = model1(X)
         loss1 = lossFunc(X, y[1])
    grads1 = suppressionTape.gradient(tape1,model1.trainable_weights)
    optimizer1.apply_gradients(zip(model1.trainable_weights))

    with tf.GradientTape() as tape2:
         X = model2(X)          # Uses output from model2
         loss2 = lossFunc(X, y[2])
    grads2 = suppressionTape.gradient(tape2,model2.trainable_weights)
    optimizer2.apply_gradients(zip(model2.trainable_weights))

    with tf.GradientTape() as tape3:
         X = model3(X)          # Uses output from model3
         loss3 = lossFunc(X, y[3])
    grads3 = suppressionTape.gradient(tape3,model3.trainable_weights)
    optimizer3.apply_gradients(zip(model3.trainable_weights))

【问题讨论】:

【参考方案1】:

我必须承认,我一直在寻找一些正确的解决方案来解决您的问题。看来您的问题的答案在这里(学分归 Laplace Ricky):

@Laplace Ricky:它应该在单个 gpu 中运行(可能是 第一个 gpu, GPU:0) 用于任何代码之外的代码 mirrored_strategy.run()。另外,因为您想要渐变 从副本返回,mirrored_strategy.gather() 也是必需的。

除此之外,还必须使用创建分布式数据集 mirrored_strategy.experimental_distribute_dataset。分布式数据集 尝试将单批数据均匀地分布在副本之间。一个 下面包括关于这些要点的示例。

model.fit()、model.predict() 等...以分布式方式运行 自动只是因为他们已经处理了所有事情 上面为你提到的。

在此处查看此主题:Tensorflow - Multi-GPU doesn’t work for model(inputs) nor when computing the gradients。

您需要使用mirrored_strategy.experimental_distribute_dataset(dataset) 并根据您的需要调整代码。

【讨论】:

以上是关于如何将多个 GPU 用于协同工作的多个模型?的主要内容,如果未能解决你的问题,请参考以下文章

Git简单使用

如何将ADS的Momentum的仿真模型作为电路元件导入电路图协同仿真

如何让 Redux Thunk 和 Apollo GraphQL 协同工作

MVC(ASP.NET MVC)带3层架构如何协同工作?

如何将 TensorFlow 图(模型)拆分到多个 GPU 上以避免 OOM?

SpringCloud微服务开发如何协同