Я новичок в использовании Tensorflow для распределенного обучения. Пока что мой код работает нормально. Но когда я наблюдаю за процессом, меня что-то удивляет.
У меня есть два вычислительных узла ЦП. Каждый процессор Intel (R) Xeon (R) E5-2680 0 @ 2,70 ГГц. 32 ядра.
Используя tf.distribute.experimental.MultiWorkerMirroredStrategy()
, я могу распределить учебное задание на эти два процессора.
Вот некоторые цифры.
Case1: CIFAR10 с Resnet56
Тренировка на одном ЦП с размером пакета 64: загрузка каждого ядра ЦП ~ 68%
Тренировка на двух ЦП с размером пакета 128 (каждый процессор получил 64): Загрузка каждого ядра ЦП ~ 68%
Case2: MNIST di git с 5-уровневой сетью
Обучение на одном процессоре с размером пакета 64: использование каждого ядра процессора ~ 40%
Обучение на двух процессорах с размер пакета 128 (каждый процессор получил 64): загрузка каждого ядра процессора ~ 15%
Мой вопрос здесь: почему в случае 2, когда задание распределяется, загрузка ЦП снижается? Я полагаю, что загрузка ЦП должна как-то оставаться ~ 40%, так как каждый ЦП получает одинаковый размер пакета с ситуацией обучения с одним ЦП.
Вот как скомпилирована модель. Я не знаю, имеет ли это какое-то отношение к оптимизатору или что-то в тензорном потоке.
model.compile(
loss=tf.keras.losses.sparse_categorical_crossentropy,
optimizer=tf.keras.optimizers.SGD(learning_rate=0.001),
metrics=['accuracy'])
Обновление: я также отслеживаю пропускную способность между двумя узлами. ~ 386Mbit / с. Они подключены через порт 1G. Возможно ли, что узким местом является сетевое соединение? Но я также полагаю, что пропускной способности достаточно для ~ 386 * 2 Мбит / с <1G. </p>
Большое спасибо!