Серверы параметров Tensorflow в SageMaker - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь понять, как работают серверы параметров (PS) для распределенного обучения в Tensorflow на Amazon SageMaker.

Чтобы сделать вещи более конкретными, я могу запустить пример из AWS, используя PS: https://github.com/aws-samples/amazon-sagemaker-script-mode/blob/master/tf-distribution-options/tf-distributed-training.ipynb

Вот блок кода, который инициализирует оценщик для Tensorflow:

from sagemaker.tensorflow import TensorFlow

git_config = {'repo': 'https://github.com/aws-samples/amazon-sagemaker-script-mode', 'branch': 'master'}

ps_instance_type = 'ml.p3.2xlarge'
ps_instance_count = 2

model_dir = "/opt/ml/model"

distributions = {'parameter_server': {
                    'enabled': True}
                }
hyperparameters = {'epochs': 60, 'batch-size' : 256}

estimator_ps = TensorFlow(
                       git_config=git_config,
                       source_dir='tf-distribution-options/code',
                       entry_point='train_ps.py', 
                       base_job_name='ps-cifar10-tf',
                       role=role,
                       framework_version='1.13',
                       py_version='py3',
                       hyperparameters=hyperparameters,
                       train_instance_count=ps_instance_count, 
                       train_instance_type=ps_instance_type,
                       model_dir=model_dir,
                       tags = [{'Key' : 'Project', 'Value' : 'cifar10'},{'Key' : 'TensorBoard', 'Value' : 'dist'}],
                       distributions=distributions)

Просматривая документацию по Tensorflow, кажется, что область действия устройства может использоваться для назначения переменной конкретному работнику. Тем не менее, я никогда не видел, чтобы это было сделано при выполнении тренировочных заданий в SageMaker. В примере из AWS модель определяется следующим образом:

https://github.com/aws-samples/amazon-sagemaker-script-mode/blob/master/tf-distribution-options/code/model_def.py

Вот фрагмент:

def get_model(learning_rate, weight_decay, optimizer, momentum, size, mpi=False, hvd=False):

    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same', input_shape=(HEIGHT, WIDTH, DEPTH)))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Conv2D(32, (3, 3)))

    ...

    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(NUM_CLASSES))
    model.add(Activation('softmax'))

    if mpi:
        size = hvd.size()

    if optimizer.lower() == 'sgd':
        ...

    if mpi:
        opt = hvd.DistributedOptimizer(opt)

    model.compile(loss='categorical_crossentropy',
                  optimizer=opt,
                  metrics=['accuracy'])

    return model

Здесь , нет никаких ссылок на стратегии распространения (за исключением MPI, но этот флаг установлен в False для PS). Так или иначе, Tensorflow или контейнер SageMaker могут решить, где следует хранить переменные для каждого слоя. Тем не менее, я не вижу ничего в коде контейнера, который бы что-то делал со стратегией распространения.

Я могу запустить этот код и обучить модель, используя 1 и 2 экземпляра. Когда я делаю это, я вижу уменьшение времени выполнения почти на 50%, что говорит о том, что происходит распределенное обучение.

Мои вопросы:

  1. Как Tensorflow решает распределение переменных на PS? В коде примера нет явной ссылки на устройства. Каким-то образом распределение осуществляется автоматически.
  2. Можно ли увидеть, какие параметры были назначены для каждого PS? Или посмотреть, как выглядит связь между PS? Если да, то как?
...