Tensor Processing Unit의 줄임말이다. GPU는 그래픽 처리나 여러 병렬처리 연산에 사용되는 범용적인 프로세서이고 딥러닝에서도 GPU를 이용한 분산 처리가 일반적이다. TPU는 딥러닝에서 가중치를 계산하는, 즉 tensor를 여러 코어가 분산해서 동시에 계산하는데 특화된 하드웨어 가속기이며 구글에서 개발하고 지원 중이다.
Kaggle에서 무료로 이용할 수 있다. 주당 20시간, 그리고 한 세션에 최대 9시간 이용 가능하다.
Kaggle notebook을 이용한다면 Accelarator를 TPU v3-8로 설정하는 것이 시작이다. 화면의 우측 상단에서 다음과 같이 변경한 후 세션을 요청하면 된다.
참고로 GPU T4 x2로 변경하면 세션을 바로 생성되는 것과 다르게, 사용자가 많으면 대기를 해야한다.
이후에 아래 코드를 이용해서 tpu를 이용하면 된다.
# detect and init the TPU
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
# instantiate a distribution strategy
tpu_strategy = tf.distribute.experimental.TPUStrategy(tpu)
# instantiating the model in the strategy scope creates the model on the TPU
with tpu_strategy.scope():
model = tf.keras.Sequential( … ) # define your model normally
model.compile( … )
# train model normally
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=…)
위 코드는 kaggle에서 제공하는 TPU 소개글에 있는 코드이다. 주석으로 이해해볼 수 있지만 정리를 해보면 아래와 같다.
1. TPU 서버에서 TPU Cluster를 요청하고 반환 받는다.
2. 할당 받은 TPU 유닛을 이용해서 strategy를 정의한다.
3. strategy.scope()
메소드 범위 안에서 model을 정의하고 컴파일한다.
4. 학습시킨다. 이때 strategy.scope()
범위를 벗어나서 진행하면 된다.
공식 문서에 따르면 TPU v3-8의 경우 코어가 8개이고, 경험상으로는 하나의 코어 당 128개의 element를 돌리는 걸 추천한다고 한다. 이 정도 규모에서 일반적으로 코어가 쉬지 않고 돌아간다고 하고, 코어 당 8개 정도로 계산해서 배치 사이즈를 설정해도 속도가 향상되는 걸 체감할 수 있다고 한다.
BATCH_SIZE = 16 * strategy.num_replicas_in_sync
여기서 strategy.num_replicas_in_sync
는 현재 이용 가능한 tpu 유닛의 수를 나타낸다고 한다.
개인적인 사용 경험으로는, 당연하게도 처리하는 데이터 하나의 크기에 따라 처리 가능한 사이즈로 조절을 해주어야 한다.
배치 사이즈가 커짐에 따라 learning rate도 커져야 한다. 공식 문서에서 이 부분 역시 경험적으로 그렇다고 한다.
추가적으로 learning rate를 조절하는 것은 Bag of Tricks(2018) 논문을 참고하면 도움이 된다. 간단히 말하면 배치 사이즈를 키울 때 특정 수준을 넘어가면 에러가 급격하게 늘어나는데, learning rate warm-up과 learning rate decay라는 방법을 섞어서 사용하면 에러가 급격하게 늘어나는 지점을 더 키울 수 있고, 이 말은 에러를 늘리지 않는 선에서 큰 배치 사이즈를 확보할 수 있게 된다.
tf.distribue
가 뭐야?resolver
는 뭐고 tf.distribute.cluster_resolver
는 뭐야?