* 학습시간을 최대한 줄이기 위해 분산학습 이용.
* 동기화/비동기화 분산학습
* 동기화 분산학습 : 일반적으로 동시에 데이터 세트의 다른 부분을 학습, 에포크가 끝날 때 그러한 경사도들이 집계되어 모델을 업데이트.
* 비동기화 분산학습 : 모든 부분이 동시에 독립적으로 학습하여 가중치를 동시에 업데이트.
*분산학습 전략
① 미러링 전략 : 단일 컴퓨터에 다수의 기기, 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))
=> 분산모델이 더 빠를것이라고 예상했는데 일반모델이 더 빠르게 나옴.
그 이유는 분산 기기는 풀에 GPU랑 CPU가 같이 있어서 CPU의 낮은 성능으로 저렇게 나옴.
GPU하나만 있으면 분산하지 않고 일반 모델로 돌리는게 더 낫다!
2개 이상의 GPU면 당연히 분산 모델이 낫고!
'스터디 > AI' 카테고리의 다른 글
[실무] 프로젝트 모델 실험관리 (0) | 2023.02.23 |
---|---|
[실무] ML(머신러닝) 실무노트 (0) | 2023.02.16 |
[Imple] 텐서플로우 라이트(TensorFlow Lite) (0) | 2023.02.14 |
[Imple] 텐서플로우 서빙(TensorFlow Serving) 분류모델 api (1) | 2023.02.13 |
[Imple] Flask를 이용한 api 샘플 (0) | 2023.02.13 |