cho.sh
INCL이란

INCL이란

Warning

Over a year old. May be outdated

정보

Lunit 기술 블로그 글을 빠르게 공유하려고 번역하고 줄인 글입니다.

Lunit은 매일 엄청나게 많은 딥러닝 모델을 학습시킨다. 처음엔 온프레미스 서버를 썼는데 문제가 자주 터졌다. 연구팀이 커지면서 학습 인프라를 클라우드로 옮겼지만, 이번엔 손으로 할 일이 너무 많아서 시간도 오래 걸리고 실수도 늘었다. 그래서 Lunit은 클라우드의 장점을 제대로 뽑아 먹으려고 딥러닝 학습 플랫폼 INtelligent CLoud(INCL)를 직접 만들었다. INCL이 필요한 자원을 알아서 띄우고 반복 작업을 없애 주니까, 연구원은 모델과 알고리즘 개발에만 집중하면 된다.

왜 클라우드로 옮겼나

  • 확장성. 온프레미스 서버는 늘리기가 어렵다. 팀원이 늘면 자원도 더 필요하고, 마감이 다가오면 학습 수요가 확 뛴다. 새 하드웨어를 사려면 돈도 시간도 많이 들고, 얼마나 필요할지 예측하기도 어려워서 너무 적게 사거나 너무 많이 살 위험이 있다.
  • 하드웨어. 서버가 낡으면서 GPU 고장이 잦아졌다. 오래된 GPU는 느려지거나 아예 망가져서 다운타임과 유지비가 늘어난다.

클라우드로 옮기면 초기 투자 없이 쓴 만큼만 내고 좋은 GPU를 바로 쓸 수 있고, 필요하면 자원을 거의 끝없이 늘릴 수 있다.

근데 새로운 문제가 생겼다

클라우드가 온프레미스보다 낫긴 한데, 모델 하나 학습시키는 데 여전히 손이 너무 많이 간다. 딥러닝 학습은 보통 이렇게 흘러간다.

  1. 가상 머신 만들기
  2. 학습 환경 설정(데이터, 코드)
  3. 모델 학습
  4. 결과물을 클라우드 스토리지에 저장
  5. 가상 머신 삭제

모델 하나면 할 만한데, 수백 개가 되면 손이 감당을 못 한다. 클라우드에서 학습하다 보면 이런 일도 따라붙는다.

  • 실험 결과 관리
  • 로그 모니터링
  • 오류 처리
  • 멀티 노드 분산 학습 인프라 확장

이런 수작업은 시간을 잡아먹고 실수를 부른다. 자동화에 부가 기능까지 붙은 제대로 된 도구가 필요했다. Spotty 같은 오픈 소스 플랫폼도 있었지만 정작 중요한 기능이 빠져 있었다. 대부분 스토리지만 지원해서 의료 이미지 처리가 느렸고, 그게 학습 병목이 됐다. 멀티 노드 분산 학습 지원도 부족했다. 우리는 GPU 할당량 관리, GPU가 놀고 있는지 감지하는 기능, 팀 협업 기능까지 필요했는데 그걸 다 해 주는 플랫폼은 거의 없었다. 그래서 결국 직접 만들었다. 그게 INtelligent CLoud(INCL)다.

INtelligent CLoud (INCL) 플랫폼

그럼 INCL은 뭘 하나? (내부 구조는 에, GPU 비용을 줄인 방법은 에 따로 정리했다.)

수작업 자동화

INCL의 목표는 클라우드에서 딥러닝 모델을 최소한의 노력으로 학습시키는 것이다. 학습에 딸린 수작업을 자동화해서 연구원이 모델과 알고리즘 개발에 집중하게 한다. 실험에 필요한 건 스크립트, Docker 이미지, 인스턴스 정보뿐이고 나머지는 INCL이 한다. 작업 디렉터리의 코드를 올리고, 인스턴스를 띄워 환경을 구성한 다음, 실험을 알아서 돌린다. 실행 중에 생기는 오류도 알아서 처리하니까 연구원은 연구에만 시간을 쓰면 된다.

실험 추적과 관리

딥러닝 프로젝트가 복잡해지면 실험 추적과 관리가 꼭 필요하다. 전용 시스템이 없으면 실험 상태, 구성, 진행 상황을 한눈에 보기 어렵다. INCL은 CLI와 웹 UI 양쪽에서 쓸 수 있는 추적, 관리 시스템을 준다. 실험 상태와 구성은 작업 목록으로 보여 주고, 로그는 실시간으로 스트리밍한다. 결과는 자동으로 저장되고 언제든 다운로드하거나 공유할 수 있다. 진행 상황과 상태 변화는 실시간으로 갱신되고 Slack 알림으로도 온다. 손실, 정확도 같은 사용자 지정 지표를 실시간 그래프로 보면서 모델 성능을 바로 판단하고 조정할 수 있다. 모델 레지스트리에서는 모델 등록, 메타데이터 추가, 버전 추적을 할 수 있어서 모델의 전체 수명주기를 관리하기 쉽고 프로덕션 배포도 단순해진다.

멀티 노드 분산 학습

데이터셋이 크고 모델이 복잡하면 학습 시간을 줄이려고 멀티 노드 분산 학습을 쓸 수밖에 없다. 계산을 여러 노드에 나눠 병렬 처리를 최대로 끌어올리면 배치 크기를 키우고 많은 데이터를 효율적으로 처리할 수 있다. INCL에서는 노드 수만 정하면 분산 학습에 필요한 인프라를 알아서 프로비저닝하고 환경 변수까지 설정해 준다. 실행 스크립트는 그 변수만 받아 쓰면 된다.

하이퍼파라미터 최적화 자동화

하이퍼파라미터를 손으로 튜닝하면 시간이 엄청 든다. INCL은 Tree-structured Parzen Estimator(TPE)를 개선한 자체 알고리즘으로 하이퍼파라미터 최적화를 통째로 자동화했다. 하이퍼파라미터 평가를 여러 노드에 나눠서 탐색 속도를 높이고, 연구원은 최적화할 메트릭을 incl.log로 기록하기만 하면 된다. 구성 파일에 정의한 이름 그대로 값이 환경 변수로 들어가고, 그게 탐색 범위가 된다. 그래서 코드를 거의 안 고치고도 병렬 HPO를 쓸 수 있다.

Backlinks4