본문 바로가기

환경설정 log

Horovod + tensorflow 설치 및 세팅까지 (1)

필요한 framework에서 Multi-Gpu 환경을 돌리려던 중, Horovod라는 것을 사용한다고 하여 알아보기 시작하였다.

본 포스팅에서는 Horovod가 무엇이고 왜 생겼는지를 정리하였다. 구체적인 세팅은 다음 포스팅에 적을 예정이다.

 

 

Horovod란, AI/딥러닝 커뮤니티 중 하나인 LF AI Foundateion(이후 LF AI)에서 만든 오픈 소스 프로젝트이다.

 

그럼 얘가 도대체 왜 생긴걸까?

 

출처 : Horovod Github[1]

한마디로 정리하자면, 좀더 쉽고 빠른 training 을 위해서이다.

 

 

Horovod는 single-GPU TF 프로그램을 "distributed" mode로 바꾸어 다수 GPU에서 training시키는 것을 목적으로 한다.

 

이때, 프로그램을 "distributed" 하게 만든다고 할 때 새로 대두되는 이슈가 두 가지가 있다:

 

1. single GPU를 가정하고 짜여진 프로그램을 "distributed"하게 만드려면 코드를 얼마나 바꿔야 하는가?

그리고 바꾼 코드를 실제로 사용하기 쉬울 것인가?

2. "distributed"된 프로그램이 실제로 빠르게 돌 수 있을 것인가?

 

Horovod Github 에서는 위 두가지 문제에 대한 답을 기존 multi-gpu training에 사용되던  "Distributed TF"와 비교하여 적어놓았다.

 

첫번째 이슈에 대한 답은 MPI model(Message Passing Interface)로, "Distributed TF"와 비교하였을 때 더 straightforward하여 쓰기 쉽고, 코드 변화도 더 적다고 한다.

두번째에 대한 답은 위의 차트와 같다. Inception V3 와 ResNet-101에서 Ideal의 90% 에 해당하는 성능을 보인다고 한다. 보다 많은 benchmark 결과는 github에서 찾을 수 있다.

 

 

 

 

사족 : MPI 란 ?

MPI가 뭔가 했더니 NVIDIA GPU 통신방법 중 UVA에서 사용하는 통신 방식을 말하는 것이었다. 한마디로 정리하면, Host memory와 GPU memory 간 통신시 특정 memory space를 통째로 copy하지 않고, pointer만 넘겨주는 방식이다. 자세하게 정리한 내용을 아래에 붙인다.

distributed process간 표준 통신 API 중 하나로, message 를 이용하여 통신하는 것이 특징이다. 주로 multi-node computer cluster에서 사용된다고 한다. [2] NVIDIA 홈페이지에 따르면 library 로 구현되어 있고, C, C++, Fortran 등 다양한 언어에서 쓰일 수 있으며 CUDA와 compatible하다고 한다.

특히, CUDA-aware MPI의 경우 Host를 거치지 않고 GPU buffer끼리의 통신이 가능하게 해준다고 한다. 실제 Implementation은 CUDA 4.0이후 UVA(Unified Virtual Addressing) 에 포함되어있는 것으로 보인다. UVA는 CPU와 GPU 가 같은 address space를 공유한다. 

 

NVIDIA 에서는 CUDA-aware MPI를 사용할 시의 장점을 다음과 같이 정리하였다.

1. 사용하기 쉬움^^

2. operation pipelining이 가능 + GPUDirect technology 사용 가능

 

 

 

 

출처

[1] https://github.com/horovod/horovod#concepts

[2] https://developer.nvidia.com/mpi-solutions-gpus

 

 

 

 

'환경설정 log' 카테고리의 다른 글

Pocketflow Multi-GPU 환경 세팅 with Docker (1)  (0) 2019.12.24
mpi4py 오류 해결 log  (1) 2019.12.14
retinaNet-tensorflow 세팅 log  (0) 2019.09.23