📔
활용정보
초보사용자 가이드누리온 지침서뉴론 지침서활용정보MyKSC 지침서
  • 활용정보
  • 1️⃣소프트웨어 설치
    • 누리온
      • LAMMPS
        • lammps-2Aug2023 설치 소개
        • lammps-3Mar20 설치 소개(SKL)
        • lammps-3Mar20 설치 소개(KNL)
        • lammps-12Dec18 설치 소개
      • GROMACS
        • GROMACS-2021.4 버전 설치 소개 (SKL)
        • GROMACS-2021.4 버전 설치 소개 (KNL)
        • GROMACS-2020.2 버전 설치 소개 (KNL)
        • GROMACS-2020.2 버전 설치 소개 (SKL)
        • GROMACS-2018.6 버전 설치 소개 (KNL)
        • GROMACS-2018.6 버전 설치 소개 (SKL)
        • GROMACS-5.1.4 설치
      • Quantum Espresso
        • Quantum Espresso-7.2 설치 소개
        • Quantum Espresso-6.6 설치 소개
        • Quantum Espresso-6.2.1 설치 소개
      • OpenFOAM
        • OpenFOAM-v1912 설치 소개
        • OpenFOAM-v1712 설치 소개
        • OpenFOAM-7 버전 설치 소개(SKL)
        • OpenFOAM-7 버전 설치 소개(KNL)
        • OpenFOAM-5.x 버전 설치 소개(SKL)
        • OpenFOAM-5.x 버전 설치 소개(KNL)
      • VASP
        • VASP 6.5.0 설치 소개
        • VASP 6.1.0 설치 소개
        • VASP 5.4.4 설치 (KNL)
        • VASP 5.4.4 설치 (SKL)
        • VASP 5.3.5 설치
      • 누리온 R-3.6.2 버전 설치 소개
      • CP2K
        • CP2K-6.1.0 버전 설치 소개
        • CP2K-5.1.0 버전 설치 소개
      • SIESTA
        • SIESTA 4.1-b3 설치(KNL)
        • SIESTA 4.1-b3 설치(SKL)
      • WRF-V3.9.1.1 설치
      • RASPA v2.0.47 설치 소개
      • gcc v8.1.0 설치
      • UPP v3.1 설치 소개
      • mpiP v3.4.1 설치 소개
      • V_Sim v3.7.2 설치 소개
      • foam-extend v3.1 설치 소개
      • ParaView v5.2.0 설치 소개
      • AutoDock Vina v1.1.2 설치 소개
      • DDSCAT v7.3.3 설치 소개
    • 뉴론
      • VASP
        • VASP 6.4.3 설치 (GPU)
        • VASP 5.4.4 설치 (GPU)
      • GROMACS
        • GROMACS-2018.6 (GPU 버전) 설치
        • GROMACS-2016.4 (GPU 버전) 설치
      • LAMMPS
        • lammps-16Mar18 (GPU 버전) 설치
      • NAMD 2.12 (GPU 버전) 설치
      • Quantum Espresso
        • Quantum Espresso-7.3 (GPU 버전) 설치
        • Quantum Espresso-6.6 (GPU 버전) 설치
        • Quantum Espresso-6.4 (GPU 버전) 설치
      • OpenFOAM-v1912 설치 소개 (SKL)
  • 2️⃣슈퍼컴퓨터 활용 팁
    • 공통
      • oneAPI 소개
      • AMD Instinct MI100 GPU 성능 테스트
      • Checkpoint 기능 관련 안내
      • 인터렉티브 작업 제출 예제
      • git 사용 방법 안내
      • PYTHON 2.7 EOL(End of Life) 안내
      • Conda 의 활용 소개
      • CPU 관련 오류 사항 ( illegal instruction )
      • vasp.5.4.4.18Apr17 Version Bug 이슈
      • 컴파일러별 AVX-512 옵션 정리
      • Linux(Unix) 에서 Text 파일 내용에 ^M 이 붙어 있는 경우 해결 방법
      • vasp.5.4.1.24Jun15 Version Bug 이슈
      • 오픈 소스 빌드 시에 OpenMP 체크 오류 (Intel 컴파일러)
      • X86_64 어셈블리 프로그래밍 기초
    • 누리온
      • MVAPICH2/MVAPICH2-X 성능 비교(VASP)
      • WRF
        • WRF 멀티노드 활용(SKL)
        • WRF 멀티노드 활용(KNL)
      • VASP
        • VASP 멀티노드 활용(SKL)
        • VASP 멀티노드 활용(KNL)
      • LAMMPS
        • LAMMPS 멀티노드 활용(SKL)
        • LAMMPS 멀티노드 활용(KNL)
      • Gromacs
        • Gromacs 멀티노드 활용 (SKL)
        • Gromacs 멀티노드 활용 (KNL)
      • QE
        • QE 멀티노드 활용(SKL)
        • QE 멀티노드 활용(KNL)
    • 뉴론
      • SSH Port Forwarding 을 통한 Jupyter 작업 실행
      • AMD 노드 활용
      • LAMMPS 멀티노드 활용
      • Gromacs 멀티노드 활용
      • OpenMPI 3.1.X 이슈 사항
      • MPI 환경설정 및 작업 제출 방법(2021.03)
  • 3️⃣동영상 지침서
    • 공통
      • 파일 전송 (FTP) 사용법
    • 누리온
      • 작업 제출 방법
      • 작업 스크립트 작성법
      • 슈퍼컴퓨터 모듈 사용법
      • 슈퍼컴퓨터 접속 방법 [Windows 사용자]
      • 슈퍼컴퓨터 접속 방법 [Mac 사용자]
    • 뉴론
      • 인터렉티브 작업 방법
      • Slurm 작업 제출 방법
      • conda 설정방법
      • 작업 스크립트 작성 방법
  • 4️⃣기타
    • 누리온
      • FAQ (2025.03)
      • 사용자 지침서 (2021.05)
      • 데스크톱 가상화(VDI)
      • TSMSF 사용자 지침서
      • i-PI 사용법 (LAMMPS)
      • 딥러닝 프레임워크 병렬화 사용법
      • Q-CHEM v5.2 사용자 지침서
      • ABAQUS 사용자 지침서(2020.12)
      • OpenFOAM 사용자 지침서
      • 가우시안16(Gaussian16) S/W 사용 안내 (2019.03)
      • ANSYS FLUENT 사용자 지침서(2020.03)
      • ANSYS CFX 사용자 지침서(2020.02)
      • NASTRAN 사용자 지침서(2020.02)
      • LS-DYNA 사용자 지침서(2020.02)
      • 가우시안16(Gaussian16) LINDA S/W 사용 안내 (2019.08)
    • 뉴론
      • 공유 노드 정책 변경에 따른 메모리 할당량 설정 안내
      • SLURM 스케줄러 Fairshare 스케줄링 정책
      • FAQ (2025.01)
      • OpenFOAM 사용자 지침서
      • Jupyter 사용자 지침서
      • 딥러닝 프레임워크 병렬화 사용법
      • Keras 기반 Multi GPU 사용 방법 (2020.10)
      • 가우시안16(Gaussian16) GPU S/W 사용 안내 (2019.08)
      • slurm 스케쥴러 기본 사용법 (2021.04)
      • 뉴론 시스템 개요(2021.04)
  • External Link
    • Nurion Guide(Eng)
    • Neuron Guide(Eng)
Powered by GitBook
On this page
  • 가. Tensorflow에서 Horovod 사용법
  • 나. Keras에서 Horovod 사용법
  • 다. PyTorch에서 Horovod 사용법
  1. 기타
  2. 뉴론

딥러닝 프레임워크 병렬화 사용법

슈퍼컴퓨팅인프라센터 2019. 10. 23. 16:25

가. Tensorflow에서 Horovod 사용법

다중노드에서 멀티 GPU를 활용할 경우 Horovod를 Tensorflow와 연동하여 병렬화가 가능하다. 아래 예시와 같이 Horovod 사용을 위한 코드를 추가해주면 Tensorflow와 연동이 가능하다. Tensorflow 및 Tensorflow에서 활용 가능한 Keras API 모두 Horovod와 연동이 가능하며 우선 Tensorflow에서 Horovod와 연동하는 방법을 소개한다. (예시: MNIST Dataset 및 LeNet-5 CNN 구조)

※ Tensorflow에서 Horovod 활용을 위한 자세한 사용법은 Horovod 공식 가이드 참조 (https://github.com/horovod/horovod#usage)

  • Tensorflow에서 Horovod 사용을 위한 import 및 메인 함수에서 Horovod 초기화

import horovod.tensorflow as hvd
...
hvd.init()

※ horovod.tensorflow: Horovod를 Tensorflow와 연동하기 위한 모듈

※ Horovod를 사용하기 위하여 초기화한다.

  • 메인 함수에서 Horovod 활용을 위한 Dataset 설정

(x_train, y_train), (x_test, y_test) = \
keras.datasets.mnist.load_data('MNIST-data-%d' % hvd.rank())

※ 각 작업별로 접근할 dataset을 설정하기 위하여 Horovod rank에 따라 설정 및 생성한다.

  • 메인 함수에서 optimizer에 Horovod 관련 설정 및 broadcast, 학습 진행 수 설정

opt = tf.train.AdamOptimizer(0.001 * hvd.size())
opt = hvd.DistributedOptimizer(opt)
global_step = tf.train.get_or_create_global_step()
train_op = opt.minimize(loss, global_step=global_step)
hooks = [hvd.BroadcastGlobalVariablesHook(0),
tf.train.StopAtStepHook(last_step=20000 // hvd.size()), ... ]

※ Optimizer에 Horovod 관련 설정을 적용하고 각 작업에 broadcast를 활용하여 전달함

※ 각 작업들의 학습과정 step을 Horovod 작업 수에 따라 설정함

  • Horovod의 프로세스 rank 에 따라 GPU Device 할당

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list = str(hvd.local_rank())

※ 각 GPU 별로 하나의 작업을 Horovod의 local rank에 따라 할당함

  • Rank 0 작업에 Checkpoint 설정

checkpoint_dir = './checkpoints' if hvd.rank() == 0 else None
...
with tf.train.MonitoredTrainingSession(checkpoint_dir=checkpoint_dir,
hooks=hooks,
config=config) as mon_sess:

※ Checkpoint 저장 및 불러오는 작업은 하나의 프로세스에서 수행되어야 하므로 rank 0번에 설정함


나. Keras에서 Horovod 사용법

Tensorflow에서는 Keras API를 활용할 경우에도 Horovod와 연동하여 병렬화가 가능하다. 아래 예시와 같이 Horovod 사용을 위한 코드를 추가해주면 Keras와 연동이 가능하다. (예시: MNIST Dataset 및 LeNet-5 CNN 구조)

※ Keras에서 Horovod 활용을 위한 자세한 사용법은 Horovod 공식 가이드 참조 (https://github.com/horovod/horovod/blob/master/docs/keras.rst)

  • Keras에서 Horovod 사용을 위한 import 및 메인 함수에서 Horovod 초기화

import horovod.tensorflow.keras as hvd
...
hvd.init()

※ horovod.tensorflow.keras: Horovod를 Tensorflow 내의 Keras와 연동하기 위한 모듈

※ Horovod를 사용하기 위하여 초기화한다.

  • Horovod의 프로세스 rank 에 따라 GPU Device 할당

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.gpu_options.visible_device_list = str(hvd.local_rank())

※ 각 GPU 별로 하나의 작업을 Horovod의 local rank에 따라 할당함

  • 메인 함수에서 optimizer에 Horovod 관련 설정 및 broadcast, 학습 진행 수 설정

epochs = int(math.ceil(12.0 / hvd.size()))
...
opt = keras.optimizers.Adadelta(1.0 * hvd.size())
opt = hvd.DistributedOptimizer(opt)
callbacks = [ hvd.callbacks.BroadcastGlobalVariablesCallback(0), ]

※ 각 작업들의 학습과정 step을 Horovod 작업 수에 따라 설정함

※ Optimizer에 Horovod 관련 설정을 적용하고 각 작업에 broadcast를 활용하여 전달함

  • Rank 0 작업에 Checkpoint 설정

if hvd.rank() == 0:
    callbacks.append(keras.callbacks.ModelCheckpoint('./checkpoint-{epoch}.h5'))

※ Checkpoint 저장 및 불러오는 작업은 하나의 프로세스에서 수행되어야 하여 rank 0번에 설정함

  • Horovod의 프로세스 rank 에 따라 GPU Device 할당

model.fit(x_train, y_train, batch_size=batch_size, callbacks=callbacks, epochs=epochs,
verbose=1 if hvd.rank() == 0 else 0, validation_data=(x_test, y_test))

※ 학습 중 출력되는 문구를 Rank 0번 작업에서만 출력하기 위하여 Rank 0번 작업만 verbose 값을 1로 설정함

다. PyTorch에서 Horovod 사용법

다중노드에서 멀티 GPU를 활용할 경우 Horovod를 PyTorch와 연동하여 병렬화가 가능하다. 아래 예시와 같이 Horovod 사용을 위한 코드를 추가해주면 PyTorch와 연동이 가능하다. (예시: MNIST Dataset 및 LeNet-5 CNN 구조)

※ PyTorch에서 Horovod 활용을 위한 자세한 사용법은 Horovod 공식 가이드 참조 (https://github.com/horovod/horovod/blob/master/docs/pytorch.rst)

  • PyTorch에서 Horovod 사용을 위한 import 및 메인 함수에서 Horovod 초기화 및 설정

import torch.utils.data.distributed
import horovod.torch as hvd
...
hvd.init()if args.cuda:
    torch.cuda.set_device(hvd.local_rank())
    torch.set_num_threads(1)

※ torch.utils.data.distributed: PyTorch에서 distributed training을 수행하기 위한 모듈

※ horovod.torch: Horovod를 PyTorch와 연동하기 위한 모듈

※ Horovod 초기화 및 초기화 과정에서 설정된 rank에 따라 작업을 수행할 device를 설정한다.

※ 각 작업별로 CPU thread 1개를 사용하기 위해 torch.set_num_threads(1)를 사용한다.

  • Training 과정에 Horovod 관련 내용 추가

def train(args, model, device, train_loader, optimizer, epoch):
...
train_sampler.set_epoch(epoch)
...
    if batch_idx % args.log_interval == 0:
        print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
               epoch, batch_idx * len(data), len(train_sampler),
               100.* batch_idx / len(train_loader), loss.item()))

※ train_sampler.set_epoch(epoch): train sampler의 epoch 설정

※ Training dataset이 여러 작업들에 나뉘어서 처리되므로 전체 dataset 크기 확인을 위하여 len(train_sampler)을 사용한다.

  • Horovod를 활용하여 평균값 계산

def metric_average(val, name):
tensor = torch.tensor(val)
avg_tensor = hvd.allreduce(tensor, name=name)
return avg_tensor.item()

※ 여러 노드에 걸쳐 평균값을 계산하기 위하여 Horovod의 Allreduce 통신을 활용하여 계산한다.

  • Test 과정에 Horovod 관련 내용 추가

test_loss /= len(test_sampler)
test_accuracy /= len(test_sampler)
test_loss = metric_average(test_loss, 'avg_loss')
test_accuracy = metric_average(test_accuracy, 'avg_accuracy')
if hvd.rank() == 0:
    print('\nTest set: Average loss: {:.4f}, Accuracy: {:.2f}%\n'.format(
        test_loss, 100. * test_accuracy))

※ 여러 노드에 걸쳐 평균값을 계산해야 하므로 위에서 선언된 metric_average 함수를 활용한다.

※ 각 노드별로 Allreduce 통신을 거쳐 loss 및 accuracy에 대해 계산된 값을 동일하게 가지고 있으므로 rank 0번에서 print 함수를 수행한다.

  • 메인 함수에서 Horovod 활용을 위한 Dataset 설정

train_dataset = datasets.MNIST('data-%d' % hvd.rank(), train=True, download=True,
transform=transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,)) ]))
train_sampler = torch.utils.data.distributed.DistributedSampler(
train_dataset, num_replicas=hvd.size(), rank=hvd.rank())
train_loader = torch.utils.data.DataLoader(
train_dataset, batch_size=args.batch_size, sampler=train_sampler, **kwargs)
test_dataset = datasets.MNIST('data-%d' % hvd.rank(), train=False, transform=transforms.Compose([
transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]))
test_sampler = torch.utils.data.distributed.DistributedSampler(
test_dataset, num_replicas=hvd.size(), rank=hvd.rank())
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=args.test_batch_size,
sampler=test_sampler, **kwargs)

※ 각 작업별로 접근할 dataset을 설정하기 위하여 Horovod rank에 따라 설정 및 생성한다.

※ PyTorch의 distributed sampler를 설정하여 이를 data loader에 할당한다.

  • 메인 함수에서 optimizer에 Horovod 관련 설정 및 training, test 과정에 sampler 추가

optimizer = optim.SGD(model.parameters(), lr=args.lr * hvd.size(), momentum=args.momentum)
hvd.broadcast_parameters(model.state_dict(), root_rank=0)
hvd.broadcast_optimizer_state(optimizer, root_rank=0)
optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())
for epoch in range(1, args.epochs + 1):
    train(args, model, train_loader, optimizer, epoch, train_sampler)
    test(args, model, test_loader, test_sampler)

※ Optimizer에 Horovod 관련 설정을 적용하고 각 작업에 broadcast를 활용하여 전달함

※ Training 및 test 과정에 sampler를 추가하여 각 함수에 전달함

PreviousJupyter 사용자 지침서NextKeras 기반 Multi GPU 사용 방법 (2020.10)

Last updated 1 year ago

4️⃣