<aside>
💡 이 템플릿으로 엔니어링 부서의 모든 팀원을 위한 지침서를 만들어 보세요. 목차를 추가하려면 /목차를 입력하고 enter 키를 누르면 됩니다.
</aside>
Elastic Horovod를 이용하기 위해서는 Horovod와 TensorFlow 기반의 사용자 학습 모델 코드를 수정해야 합니다.
아래는 Keras를 이용한 학습 코드를 Elastic Horovod를 위해 수정할 때의 예를 나타낸 것입니다. 하이라이팅된 부분들이 Elastic Horovod를 위해 추가되거나 수정된 부분들입니다.
import tensorflow as tf
import horovod.tensorflow.keras as hvd
hvd.init()
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list = str(hvd.local_rank())
tf.keras.backend.set_session(tf.Session(config=config))
dataset = ...
model = ...
opt = keras.optimizers.Adadelta(lr * hvd.size())
opt = hvd.DistributedOptimizer(opt)
model.compile(loss=keras.losses.sparse_categorical_crossentropy,
optimizer=opt,
metrics=['accuracy'])
def on_state_reset():
tf.keras.backend.set_value(model.optimizer.lr, lr * hvd.size())
state = hvd.elastic.KerasState(model, batch=100, epoch=0)
state.register_reset_callbacks([on_state_reset])
callbacks = [
hvd.elastic.CommitStateCallback(state),
hvd.elastic.UpdateBatchStateCallback(state),
hvd.elastic.UpdateEpochStateCallback(state),
]
if hvd.rank() == 0:
callbacks.append(keras.callbacks.ModelCheckpoint('./checkpoint-{epoch}.h5'))
@hvd.elastic.run
def train(state):
model.fit(dataset,
steps_per_epoch=500 // hvd.size(),
callbacks=callbacks,
epochs=epochs - state.epoch,
verbose=1 if hvd.rank() == 0 else 0)
train(state)
on_state_reset()StateCallback@hvd.elastic.runhorovodrun -p <SSH port number> --network-interface <nic> -np <num_proc> \\
--min-np <min_num> --max-np <max_num> --host-discovery-script <path-to-script> \\
python /workspace/nvidia-examples/cnn/resnet.py
echo <host1>:<num_slots>
echo <host2>:<num_slots>
...
위 코드를 실행한 뒤 스크립트 파일을 수정하면 commit 이 수행될 때 autoscaling이 동작합니다. 변경된 클러스터의 크기가 --min-np보다 작거나, --max-np 보다 크면 대기하며, 그 밖의 경우에는 클러스터 구성을 변경하고 학습을 재개합니다.