Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • Baekjoon
  • 머신러닝
  • 알고리즘
  • 객체지향
  • MariaDB
  • 데이터베이스
  • 하둡
  • AI
  • pytorch
  • 백준
  • 빅데이터
  • 프로그래머스
  • mysql
  • TensorFlow
  • class
  • 데이터
  • 데이터사이언스
  • 파이썬기초
  • 자료구조
  • 선형대수학
  • 딥러닝
  • 객체
  • 프로그래밍
  • 선형대수
  • 파이썬
  • 인공지능
  • PYTHON
  • 코딩테스트
  • sql
  • 코테

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

[Tensorflow] Multi GPU 사용하기 (gpu 병렬처리)
파이썬/Tensorflow

[Tensorflow] Multi GPU 사용하기 (gpu 병렬처리)

2023. 2. 21. 23:27
반응형

데이터의 용량이 큰 경우,

가용할 수 있는 GPU가 여러 개인 경우, 

더 효율적으로 모델을 학습할 수 있는 방법이 있습니다.

 

단일 GPU가 아닌 여러 개의 GPU를 활용하여 분산전략을 수행한다면, 더 빠르게 모델을 학습시킬 수 있습니다. 

(물론 너무 적은 데이터의 경우 데이터를 분할하는 시간이 더 오래걸리기 때문에, 그러한 경우에는 단일 GPU를 사용하면 됩니다)

 

GPU병렬 처리에는 다양한 방법이 존재하는데요.

간단한 소개와 함께 대표적인 방법 코드를 통해 확인해보겠습니다.

 

방법1. MirroredStrategy 

TensorFlow에서 여러 gpu를 활용한 학습에 추천하는 방법입니다.

사전에 설정된 & 사용 가능한 모든 GPU자원을 동시에 활용을 하는 방법을 채택하는데요. 이때 입력 데이터는 병렬적으로 처리되어 들어갑니다. 

각 GPU는 할당된 데이터를 다루고, 각 GPU에서 얻은 기울기(gradients)는 최종적으로 집계되어 모델 가중치가 업데이트 됩니다.

 

MirrorStrategy를 활용하는 방법은 다음과 같습니다.

첫째, MirroredStrategy 인스턴스를 생성합니다.

둘째, 생성된 인스턴스의 scope를 이용하여 모델을 만들고 컴파일 합니다.

마지막으로 모델을 학습하면 됩니다.

 

# gpu 확인을 위한 함수 호출
from tensorflow.python.client import device_lib
device_lib.list_local_device()


# ------ 출력물 예제 -----
# [name: "/device:CPU:0"
#  device_type: "CPU"
#  memory_limit: 268435456
#  locality {
#  }
#  incarnation: 5201132580995199256,
#  name: "/device:GPU:0"
#  device_type: "GPU"
#  memory_limit: 10770322560
#  locality {
#    bus_id: 1
#    links {
#    }
#  }
#  incarnation: 7702391586114156914
#  physical_device_desc: "device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1",
#  name: "/device:GPU:1"
#  device_type: "GPU"
#  memory_limit: 10770692224

이제 MirroredStrategy 인스턴스를 생성하고 확인하겠습니다.

import tensorflow as tf

# gpu 이름
gpus = tf.config.experimental.list_logical_devices('GPU')

# gpu가 2개 이상이면, MirroredStrategy 인스턴스 생성
if len(gpus) > 1: 
    strategy = tf.distribute.MirroredStrategy([gpu.name for gpu in gpus])
    print('\n\n Running on multiple GPUs ', [gpu.name for gpu in gpus])

# gpu가 1개 이하면, 디폴트 전략 설정
else:
    strategy = tf.distribute.get_strategy() # default strategy that works on CPU and single GPU
    print('\n\n Running on single GPU', gpus[0].name)
    print('\n\n #accelerators: ', strategy.num_replicas_in_sync, '\n\n')


# ----- 출력물 ---
# INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1')
# Running on multiple GPUs  ['/device:GPU:0', '/device:GPU:1']

딥러닝 모델 생성 & 학습 (모델 설계는 각자 데이터와 분석 주제에 맞게 하시면 됩니다)

with strategy.scope():

    model = models.Sequential()

    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(128, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(128, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))

    model.add(layers.Flatten())
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))

    model.compile(loss='binary_crossentropy',
                  optimizer=optimizers.Adam(lr=1e-4),
                  metrics=['acc'])

history = model.fit(
    train_generator,
    steps_per_epoch=100,
    epochs=100,
    validation_data=validation_generator,
    validation_steps=50
)

가장 중요한 점은 with 구문안에서 모델이 compile이 되어야 한다는 점입니다. 따라서 텐서플로우가 모델을 properly replicate 할 수 있습니다.

 

 

다음으로는 nvidia-smi를 통해 gpu가 가동중인지 확인해봅시다. 

첫번째 사진은 모델 학습 전입니다.

모델 학습전, gpu가 쉬고 있습니다. (작동하지 않고 있음)

다음 사진은 모델 학습 중일때 입니다.

모델 학습중, gpu 두 대가 모두 활동하는 것을 볼수 있습니다.

방법2. Parameter Server Strategy

지금 이 방법부터 따로 실예제 코드를 넣진 않고, 유사 코드로 설명하겠습니다.

이 방법은 위 Mirrored Strategy와 비동기적으로 파라미터를 업데이트한다는 점이 다른점입니다 (Asynchronous replication). 

각 분산처리에서 gradient 계산이 끝난 건 먼저 사용해서 parameter를 업데이트하는 방식입니다. 

이 방식은 상대적으로 수렴이 느릴 수 있습니다.

 

하지만 모델이 굉장히 헤비하고 크다면. Mirrored Strategy보다 나은 전략을 제시할 수 있습니다. 왜냐하면 모든 gpu의 연산이 끝날 때까지 기다리는 Mirrored Strategy 방법과 다르게 계산이 끝난 gpu부터 사용하여 parameter를 업데이트 하기 때문이죠.

 

Parameter Server Strategy 인스턴스는 다음과 같이 생성할 수 있습니다.

strategy = tf.distribute.experimental.ParameterServerStrategy()

방법3. MultiWorkerMirroredStrategy

이 방법은 1번 방법과 마찬가지로 각 gpu마다 데이터를 동시에 처리합니다 (synchronous data-parellelism approach).

유일한 차이점은, 이 방법은 여러 기계 (multiple machines )로부터 모델을 학습시킬 때 사용하는 방법이라는 점입니다.

 

인스턴스 생성은 다음과 같습니다

strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()

 

각 방법별로 차이점을 알아보았습니다.

주어진 자원 할당과 데이터 & 모델 복잡도에 맞는 방법으로 활용하시면 도움이 될 듯 합니다.

분산학습에 대한 설명은 https://wooono.tistory.com/331 이 블로그 글이 잘 정리되어 있는것 같으니 참고 바랍니다.

 

 

반응형
저작자표시 (새창열림)

'파이썬 > Tensorflow' 카테고리의 다른 글

[tensorflow] 함수형 API 활용한 CNN 예시  (0) 2023.02.27
[tensorflow] tensorflow-metal 설치 방법 (m1맥북 gpu)  (1) 2022.12.24
    '파이썬/Tensorflow' 카테고리의 다른 글
    • [tensorflow] 함수형 API 활용한 CNN 예시
    • [tensorflow] tensorflow-metal 설치 방법 (m1맥북 gpu)
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바