Я пытаюсь понять, как работают серверы параметров (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%, что говорит о том, что происходит распределенное обучение.
Мои вопросы:
- Как Tensorflow решает распределение переменных на PS? В коде примера нет явной ссылки на устройства. Каким-то образом распределение осуществляется автоматически.
- Можно ли увидеть, какие параметры были назначены для каждого PS? Или посмотреть, как выглядит связь между PS? Если да, то как?