Что делает ‘с strategy.scope():’ или ‘с tf.distribute.experimental.TPUStrategy(tpu).scope(): ‘что делать с созданием NN?

#tensorflow #tensorflow2.0 #tpu

#тензорный поток #tensorflow2.0 #tpu

Вопрос:

В приведенном здесь коде: https://www.kaggle.com/ryanholbrook/detecting-the-higgs-boson-with-tpus

Перед компиляцией модели модель создается с использованием этого кода:

 with strategy.scope():
    # Wide Network
    wide = keras.experimental.LinearModel()

    # Deep Network
    inputs = keras.Input(shape=[28])
    x = dense_block(UNITS, ACTIVATION, DROPOUT)(inputs)
    x = dense_block(UNITS, ACTIVATION, DROPOUT)(x)
    x = dense_block(UNITS, ACTIVATION, DROPOUT)(x)
    x = dense_block(UNITS, ACTIVATION, DROPOUT)(x)
    x = dense_block(UNITS, ACTIVATION, DROPOUT)(x)
    outputs = layers.Dense(1)(x)
    deep = keras.Model(inputs=inputs, outputs=outputs)
    
    # Wide and Deep Network
    wide_and_deep = keras.experimental.WideDeepModel(
        linear_model=wide,
        dnn_model=deep,
        activation='sigmoid',
    )
 

Я не понимаю, что with strategy.scope() здесь происходит и влияет ли это каким-либо образом на модель. Что именно он делает?

В будущем, как я мог бы выяснить, что это делает? Какие ресурсы мне нужно изучить, чтобы разобраться в этом?

Ответ №1:

Стратегии распределения были введены как часть TF2, чтобы помочь распределить обучение между несколькими графическими процессорами, несколькими машинами или процессорами с минимальными изменениями кода. Я бы порекомендовал это руководство по распределенному обучению для начинающих.

В частности, создание модели в рамках TPUStrategy позволит разместить модель в реплицированном (одинаковые веса для каждого из ядер) виде на TPU и синхронизировать веса реплик путем добавления соответствующих коллективных сообщений (все это уменьшает градиенты). Для получения дополнительной информации ознакомьтесь с документом API по TPUStrategy, а также с этим введением к TPU в TF2 colab notebook.