스터디/AI

[Imple] 텐서플로우 분산학습

_leezoee_ 2023. 2. 15. 00:08

* 학습시간을 최대한 줄이기 위해 분산학습 이용.

* 동기화/비동기화 분산학습

 

* 동기화 분산학습 :  일반적으로 동시에 데이터 세트의 다른 부분을 학습, 에포크가 끝날 때 그러한 경사도들이 집계되어 모델을 업데이트.

* 비동기화 분산학습 : 모든 부분이 동시에 독립적으로 학습하여 가중치를 동시에 업데이트.

 

*분산학습 전략

① 미러링 전략 : 단일 컴퓨터에 다수의 기기, GPU, CPU가 있을 때 사용, 각 기기에 같은 모델의 복사본을 생성해 모두를 활용. (기기 수 만큼 모델의 복사본을 가짐)

 

=> 각 기기들은 독립적으로 학습해 에포크가 끝날 때 모든 가중치를 고려해 모델의 메인 복사본을 업데이트 함.

② 다중 작업자 미러링 전략 : 초기모델은 같으나 각 기기로 복사되는 것이 아니라 작업자라 불리는 각각의 머신이 있는 네트워크 안의 컴퓨터로 복사가 됨. 

=> 각 에포크가 끝나면 초기 모델을 업데이트 하기 위해 버전을 고려

 

<데이터 전처리>

import time
import numpy as np
import tensorflow as tf

#데이터로드
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()

#데이터 표준화 0~1
X_train = X_train / 255.
X_test = X_test / 255.

#벡터사이즈로 형변환
X_train = X_train.reshape(-1, 28*28) # -1 : 모든 데이터 형변환
X_test = X_test.reshape(-1, 28*28)

 

<비분산 모델 정의>

 

#CNN모델

model_normal = tf.keras.models.Sequential()
model_normal.add(tf.keras.layers.Dense(units=128, activation='relu', input_shape=(784,))) #완전연결레이어
model_normal.add(tf.keras.layers.Dropout(rate=0.2))
model_normal.add(tf.keras.layers.Dense(units=10, activation='softmax'))
model_normal.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'])

 

 

<분산 전략 정의>

 

#모델의 미러링 전략 수립
distribute = tf.distribute.MirroredStrategy()

 

 

<분산 모델 정의>

 

with distribute.scope():
  model_distributed = tf.keras.models.Sequential()
  model_distributed.add(tf.keras.layers.Dense(units=128, activation='relu', input_shape=(784,)))
  model_distributed.add(tf.keras.layers.Dropout(rate=0.2))
  model_distributed.add(tf.keras.layers.Dense(units=10, activation='softmax'))
  model_distributed.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'])

 

 

<평가 : 일반 모델(비 분산?)과 분산 모델>

 

start_time = time.time() #시간정의
model_distributed.fit(X_train, y_train, epochs=10, batch_size=25)
print("Distributed training took: {}".format(time.time() - start_time)) #몇 초 걸렸는지 출력

start_time = time.time()
model_normal.fit(X_train, y_train, epochs=10, batch_size=25)
print("Normal training took: {}".format(time.time() - start_time))

분산 모델 학습 시간 약 173초 소요
일반 모델 159초

=> 분산모델이 더 빠를것이라고 예상했는데 일반모델이 더 빠르게 나옴. 

그 이유는 분산 기기는 풀에 GPU랑 CPU가 같이 있어서 CPU의 낮은 성능으로 저렇게 나옴.

GPU하나만 있으면 분산하지 않고 일반 모델로 돌리는게 더 낫다!

2개 이상의 GPU면 당연히 분산 모델이 낫고!