horovod 정리

쓰여진 날: by Creative Commons Licence

Horovod

이번 글에서는 호로보드에 대해 정리를 한다.

호로보드는 우버에서 만들어져 현재 LF AI 재단에서 관리되고 있는 오픈소스이다. LFAI는 Linux Foundation of AI로 머신러닝, 딥러닝과 관련된 프로젝트를 관리하는 리눅스 재단이다. onnx도 이곳에서 관리하는 오픈소스 중 하나이다. 호로보드는 현재 LFAI 졸업 프로젝트로 완성도 있는 오픈소스로 보면 된다. 논문도 있다. 아카이브

호로보드는 딥러닝 분산 학습 프레임워크로 텐서플로, 케라스, 파이토치, MXNet을 지원한다. 사실 앞의 딥러닝 학습 프레임워크들은 분산학습 시스템을 지원한다. 그런데 왜 굳이 호로보드가 또 개발되었을까? 호로보드는 두가지에 초점을 맞춰 개발되었다.

  1. 프로그램을 분산 환경으로 만드는데 얼마나 많은 수정이 필요한가? 그리고 얼마나 쉽나?
  2. 분산 학습 모드가 얼마나 빠른가?

사실 딥러닝 프레임워크에서 분산 학습을 시도해 본 사람은 그 과정이 얼마나 골치아픈지 알 것이다. 그냥 GPU 8개를 쓴다면 비교적 쉽지만 2개 이상의 노드를 사용하려면 찾아봐도 잘 안나오고 에러 투성이다. 그리고 고생해서 분산 환경 구축에 성공해도 성능이 엄청나게 좋아지진 않는다. 호로보드는 이런 것들을 해결하기 위해 만들어졌다. 최대한 쉽게, 빠르게 학습하기 위한 툴로.

성능

성능은 뭐 당연히 좋다. 그러니 큰 IT기업들에서 쓰고 있지 않겠는가. 논문에 의하며 GPU가 많아질수록 호로보드의 GPU 효율성이 좋아진다. 기존 TF 분산학습 대비 88% 효율적이고 속도는 2배 정도 빨랐다고 한다.

작동 원리

호로보드는 하나의 프로세스에 하나의 GPU를 사용해 학습을 돌린다. 즉, 한 노드에서 8개의 GPU를 사용해 학습한다면 GPU 1개가 할당된 프로세스 8개가 각각 학습을 한다는 것이다. 8개의 학습 프로세스가 결국 하나의 학습 루프가 되기 위해서 8개의 프로세스는 각각의 웨이트와 그래디언트를 공유하고 데이터셋은 8개로 나누어 각 프로세스가 독립적인 데이터셋을 갖고 학습하도록 한다. 직관적으로 생각해보면, 한 학습 프로세스가 1/8의 데이터를 갖고 학습을 하면서 동시에 학습 상태를 공유하니 이런 방식이면 학습 시간이 정확히 1/8배가 될 거 같다.

8개의 프로세스가 동일한 그래디언트, 웨이트를 공유하도록 하는 것이 호로보드의 핵심이다. 이 과정은 allreduce 알고리즘을 통해 이루어진다. Allreduce에 대해선 뒤에서 알아보고 결국 호로보드가 하는 것은

  1. 학습 시작시 여러개의 프로세스가 같은 초기화 값을 갖게 한다.
  2. 여러개의 프로세스에서 학습이 진행되면서 그래디언트가 계산되면 allreduce를 실행한 다음 다시 프로세스들에게 상태를 공유한다.

그리고 호로보드가 하지 않는 것은

  1. 데이터셋을 독립적인 n개로 나누는 것 (TF, Pytorch는 내장됭 기능을 쓰면되고 나머지 프레임워크도 그럴것이다.)

allreduce, mpi

Allreduce는 서로 다른 상태에 있는 프로세스를 같은 상태로 만드는 알고리즘이다. allreduce, ring-allreduce 와 같은 알고리즘들이 있다. 여기서 설명은 하지않고 그냥 링크를 보자.

또 중요한 것으로 어떻게 각 노드들의 프로세스간 상태를 공유하냐이다. 뭐 그냥 엄청 빠른 메세징이 필요할 것이다. 호로보드에선 Open MPI를 사용하고 있다. 호로보드가 동작하기 위해서는 이 MPI와 NCCL이 필요하다. 그런데 이 둘은 설치하기가 끔찍히 어려우니 도커 이미지 사용을 추천한다.

직접 사용해보니 아주 약간의 코드 수정만으로 동작이 가능하다. 그리고 GPU 효율성도 상당히 좋다. 이미 꽤 큰 기업들에서는 호로보드로 분산 학습 환경에서 학습을 하고 있다고도 하니 알아두면 좋을 오픈소스이다.

단점이 있다면 멀티 노드를 구성하는데 좀 애를 먹을 수 있다는 것이다.