首页 > 解决方案 > model.compile() 是否进入 MirroredStrategy

问题描述

我有一个用于迁移学习的网络,并且想在两个 GPU 上进行训练。到目前为止,我刚刚接受了一项培训,并且正在寻找加快速度的方法。关于如何最有效地使用它,我得到了相互矛盾的答案。

strategy = tf.distribute.MirroredStrategy(devices=["/gpu:0", "/gpu:1"])
with strategy.scope():
    base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(200,200,3))
    x = base_model.output
    x = GlobalAveragePooling2D(name="class_pool")(x)
    x = Dense(1024, activation='relu', name="class_dense1")(x)
    types = Dense(20,activation='softmax', name='Class')(x)
    model = Model(inputs=base_model.input, outputs=[types])

然后我设置可训练层:

for layer in model.layers[:160]:
    layer.trainable=False
for layer in model.layers[135:]:
    layer.trainable=True

然后我编译

optimizer = Adam(learning_rate=.0000001)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics='accuracy')

一切都应该嵌套在里面strategy.scope()吗?

教程显示compile在内部,但本教程显示它在外部。第一个在外面显示

mirrored_strategy = tf.distribute.MirroredStrategy()

with mirrored_strategy.scope():
  model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])

model.compile(loss='mse', optimizer='sgd')

但在这之后马上说

在此示例中,我们使用了 MirroredStrategy,因此我们可以在具有多个 GPU 的机器上运行它。strategy.scope() 向 Keras 指示用于分发训练的策略。在这个范围内创建模型/优化器/指标允许我们创建分布式变量而不是常规变量。设置完成后,您可以像往常一样安装模型。MirroredStrategy 负责在可用 GPU 上复制模型的训练、聚合梯度等。

标签: pythontensorflowkerasmulti-gpu

解决方案


它去哪里都没有关系,因为在幕后,model.compile()会在使用的策略范围内创建优化器、损失和准确性度量变量。然后你可以调用model.fitwhich 也会在相同的策略范围内安排一个训练循环。

我建议进一步搜索,因为我的答案没有任何实验基础。这正是我的想法。


推荐阅读