딥러닝 모델이 점점 커지면서 한 대의 GPU 또는 CPU만으로 학습을 완료하기 어려운 상황이 있다. 이를 해결하기 위해 사용하는 방법이 바로 분산 학습 (Distributed Training) 이다. Tensorflow는 이 과정을 지원하는 API를 제공하는데, 이를 이용해 분산 학습을 설정하고 사용하는 방법에 대해 포스팅하려고 한다. (tensorflow 2.x 버전)
분산 학습은 학습 데이터를 여러 장치(GPU/TPU) 또는 노드(서버)로 나누어 병렬로 처리하는 방식이다. 이를 통해,
tf.distribute API를 제공하여, 다양한 학습 전략을 쉽게 설정할 수 있다.Tensorflow에서 제공하는 분산 전략은 크게 다음과 같다.
strategy = tf.distribute.MirroredStrategy()
strategy = tf.distribute.MultiWorkerMirroredStrategy()
strategy = tf.distribute.CentralStorageStrategy()
Tensorflow에서의 분산 학습의 주요 단계는 다음과 같다.
strategy = tf.distribute.MirroredStrategy()
strategy.scope() 블록 안에서 모델과 optimizer를 정의해야 한다.
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam',
loss='mse',
metrics=['mae'])
strategy.scope()는 Tensorflow의tf.distributeAPI에서 분산 학습 환경을 설정할 때 사용하는 컨텍스트(context) 매니저이다. 이 컨텍스트 안에서 모델, optimizer, 변수 등을 정의하면 지정된 분산 전략이 적용되어 여러 장치에서 병렬로 학습할 수 있다.
tf.data.Dataset을 사용하면 데이터셋을 자동으로 분산 처리 할 수 있다.
import numpy as np
x = np.random.random((1000, 10))
y = np.random.random((1000, 1))
dataset = tf.data.Dataset.from_tensor_slices((x, y)).batch(32)
# 모델 학습
model.fit(dataset, epochs=10)
Tensorflow의 tf.distribute API를 사용하면 손쉽게 분산 학습을 설정할 수 있다. 데이터의 크기와 하드웨어 환경에 맞는 전략을 선택하고, 병렬 학습으로 더 큰 모델과 데이터를 다룰 수 있다.