본문으로 건너뛰기

2020 여름 인턴십 회고

· 약 15분
이용균

래블업이라는 한국 스타트업에서 7주 동안 소프트웨어 엔지니어로 인턴을 했다. 골드만 삭스 인턴이 끝나고 가을 학기 개강까지 시간이 많이 남아 ‘놀면 뭐하나''라는 마인드로 일을 시작했는데 너무 귀한 경험이었다.

인턴 지원 과정

래블업은 OSS에서 운영하는 컨트리뷰톤에 멘토로 참가하는 회사였다. 컨트리뷰톤은 참가자가 회사와 매칭이 되어 6주 동안 멘토 회사의 오픈 소스 프로젝트에 기여를 하는 대회이다. 이 대회에 참가할까 잠깐 고민 했지만 풀타임으로 일을 하고 싶어 래블업의 창업자/CEO에게 연락하여 면접을 보고 일을 시작했다.

래블업에 대하여

래블업은 한국에서 제일 핫한 기술 스타트업으로 인공지능 연구를 위한 리소스 관리 플랫폼인 Backend.AI를 오픈소스로 개발하고 있다.

Google Colab는 간단하게 사용하기에는 편리하고 유용하지만 기능에 제한이 있다. 예를 들어 특정 OS에서만 작동하는 프로그램을 활용하거나 용량이 큰 데이터셋을 사용하는 경우에 한계가 드러난다. 그래서 제대로 인공지능 연구를 하는 기관에서는 Google Colab를 사용하지 않는다. 네이버에 있을 때에는 NSML이라는 내부 플랫폼을 사용했고, Onclusive에서는 GPU를 충분히 사용하기 위해 AWS 인스턴스를 실행시켜 모델을 학습시켰다. 간단한 방법이지만 매번 필요한 프로그램을 다운로드 받고, scp로 로컬에 있는 파일들을 전송하고, 사용 후에는 인스턴스를 정지 시켜야 했기 때문에 상당히 귀찮았다.

래블업은 B2B로 여러 기관에 Backend.AI 기술 지원을 하면서 수익을 냈다. 내가 인턴을 시작할 때 Google Colab처럼 일반 소비자를 대상으로 하는 서비스를 런칭했는데 Google Colab보다 유용하고 활용도가 높지만 유료인 서비스이다.

인턴 경험

7주 동안 하나의 큰 프로젝트를 맡아서 하기보다 여러 가지 이슈들을 해결했다. Backend.AI는 굉장히 복잡해서 개인 컴퓨터에 세팅을 하고 작동시키는 데까지 며칠이 걸리고, 시스템의 작동 흐름을 이해하는 데에는 한 달 정도가 걸렸다. UI까지 모두 로컬 환경에서 구동시키려면 총 여섯 개의 프로그램을 돌려야 하는데 터미널을 여섯 개씩 연 상태에서 일을 하면 괜히 멋있어 보이는 느낌이 들기는 한다. 어쨌든 인턴으로 일했던 내용은 아래와 같다.

GPU 균등 분배 (Even Allocation of GPU)

몇몇 연구는 모델 학습을 위해 GPU 여러 대를 사용할 때에 GPU를 고르게 분배한다는 가정을 한다. 그래서 우리는 간단한 greedy 방법 대신 알고리즘을 개발하기로 했다. 예를 들어, 0.3GPU를 0.2GPU 두 개에 분배해야 하는 경우에 0.2/0.1보다 0.15/0.15를 선택하도록 프로그램을 짰다.

나는 알고리즘 개발에 대부분의 시간을 사용했다. Leetcode 문제를 푸는 느낌이었지만 문제를 풀 때보다 훨씬 더 다양한 경우의 수를 생각해야 했고, 예상보다 예외 상황(edge case)이 많아 깔끔한 코드를 짜는 것이 어려웠다. 이 알고리즘이 시스템 내에서 작동할 수 있도록 코드를 짰다.

Github Link - PR, Issue

etcd3 라이브러리 교체

Backend.AI는 asyncio를 많이 사용한다. python-etcd3는 asyncio에서 etcd를 사용할 수 있게 해주는 오픈소스 라이브러리인데 관리가 안 된지 오래 되었고, Backend.AI 에이전트 종료시 발생하는 grpc 관련 에러가 오랜 기간 수정되지 않고 있었다. 그래서 나는 python-etcd3를 포크한 etcd3aio를 포크한 aetcd3라는 라이브러리를 찾아 몇 군데 수정하고 python-etcd3와 교체한 후 로컬 환경에서 Backend.AI가 에러 없이 실행되도록 만들었다. 하지만 Backend.AI처럼 복잡한 시스템에서 사용하는 외부 라이브러리를 교체하는 일은 매우 조심해야 하기 때문에 결국 내가 근무하는 기간 동안 내 성과가 반영되지 못했다. 그래도 여러 오픈소스 라이브러리로 실험을 하고 사람들이 올린 이슈를 읽으면서 오픈소스 커뮤니티를 살짝 경험해볼 수 있었다.

Github Link - Issue

XFS 스토리지 프록시 (XFS storage proxy)

XFS는 실리콘 그래픽스라는 회사에서 만든 파일 시스템으로 Backend.AI의 XFS 스토리지 프록시를 개발했다. Backend.AI는 가상 폴더 시스템을 사용한다. 사용자들은 클라우드에 각자의 개인 가상 폴더를 만들고, 파일, 라이브러리, 혹은 코드를 저장할 수 있다. 물론 폴더 공유나 복제, 접근 권한 관련 기능이 구현되어 있다. 실제로 가상 폴더는 프로그램에서 지정한 파일 시스템에 특정 구조로 저장이 되고, XFS는 Backend.AI가 지원하는 파일 시스템 중 하나이다.

기본적인 가상 폴더 기능은 이미 구현이 되어 있어 나는 이를 XFS에 적용시켰다. XFS에서는 프로젝트 단위로 파일 시스템이 관리되는데 /etc/projid/etc/projects에 프로젝트에 대한 정보가 저장된다. 그래서 가상 폴더를 새로 만들거나 지울 경우 앞의 두 파일을 적합하게 업데이트했다. 각 프로젝트에는 메모리 할당량(quota)이 있어 파일 용량이 넘어가면 할당량을 직접 늘려줬다.

XFS와 같은 파일 시스템은 처음 경험해봐서 XFS의 작동 원리와 사용 방법을 이해하고 익히는 데에 시간이 꽤 걸렸다. OSX는 XFS를 지원하지 않기 때문에 AWS에서 우분투 인스턴스를 만들어 작업했다. 터미널에서만 작업을 해야 했기 때문에 tmux와 vim 사용법을 익혔는데 생각보다 재밌었다.

Github Link - PR

가상 폴더 나가기

사용자들이 공유 가상 폴더를 나갈 수 있는 기능을 구현했다. 여러 명이 공유하는 가상 폴더에서 사용자가 나가면 이를 관리하는 데이터베이스에 변화를 적용하고 해당 폴더에 대한 사용자의 접근 권한을 없앴다. 그리고 파이썬 클라이언트를 통해 이 기능을 실행할 수 있게 하였다. 전형적인 백엔드 일로 API 엔드 포인트와 관련 기능을 구현했다.

Github Link - Issue, PR (manager), PR (client-py)

가상 폴더 복제

공유 가상 폴더 혹은 그룹 가상 폴더를 개인 가상 폴더로 복제하는 기능은 사용자들이 기존 프로젝트를 시작점으로 새로운 프로젝트를 쉽게 시작하거나 공유 가상 폴더의 내용을 실험적으로 사용하고 싶을 때 유용하다. 가상 폴더 나가기 기능 구현 작업처럼 Backend.AI 에이전트와 매니저 그리고 파이썬 클라이언트에 관련 기능을 구현했다.

Github Link - Issue, PR (manager), PR (client-py)

설치 스크립트 업데이트

Backend.AI를 실행하기 위한 모든 프로그램을 설치하고 알맞은 환경 설정을 하는 설치 스크립트를 업데이트했다. 스크립트 실행 시 다른 작업 없이 바로 Backend.AI를 돌릴 수 있는 상태까지 만드는 것이 목표였다. 도커에서 etcd와 postgres 설정을 하는 등의 작업이 포함되어 있다.

Github Link - Issue1, Issue2, PR

글로벌 닷파일 (Global Dotfiles)

Backend.AI는 사용자들이 각자의 컨테이너에서 ~/.bashrc~/.zshrc 같은 설정 파일을 수정할 수 있게 한다. 관리자 역시 글로벌 설정 파일을 수정하여 그룹 설정을 할 수 있어야 하기 때문에 도메인 혹은 그룹 레벨에서 /etc/bash.bashrc/etc/profile와 같은 설정 파일을 수정할 수 있는 기능을 구현하였다.

그룹 및 도메인을 관리하는 postgres 테이블에 닷파일을 저장할 수 있게 하고, Backend.AI 매니저, 에이전트, 그리고 파이썬 클라이언트에 닷파일을 생성, 수정, 삭제할 수 있는 기능을 추가하였다. 그리고 커널을 시작할 때 이 닷파일을 원하는 위치에 복사하도록 코드를 수정했다.

Github Link - Issue, PR (manager), PR (agent), PR (client-py)

서비스 포트 확인

주피터 노트북과 같은 앱은 Backend.AI 컨테이너 안에서 특정 포트를 사용하며 실행되는데 사용자들은 직접 서비스와 해당 포트 번호를 미리 입력해야 한다. 이 때 사용자들이 입력하는 포트는 여러 조건을 만족해야 한다. 예를 들어 같은 포트 번호가 중복 되면 안 되고, 1부터 65535까지의 숫자여야 하며, 시스템에서 내부적으로 사용하는 포트 번호를 입력하면 안 된다. 나는 이렇게 커널 시작 전에 사용자가 입력한 포트 번호를 확인하고, 문제가 있으면 에러를 발생시키는 코드를 짰다. UI에도 에러를 표시하도록 업데이트했다.

Fig.1 서비스 포트 확인을 위한 UI 프로토타입

Github Link - PR (manager), PR (agent), PR (console), PR (common)

인턴십 후기

래블업 인턴십은 어려웠지만 재밌었다. Backend.AI를 구동하는 데에 사용되는 기술을 대부분 처음 접해봐서 일을 하며 그 기술을 배워나가는 과정이 흥미로웠다. 특히 기존 코드 베이스와 인터넷의 여러 가지 문서를 몇 시간 동안 읽은 후에 내가 구현한 코드가 잘 작동할 때의 쾌감이 대단했다. Backend.AI를 구성하는 다양한 부분 (매니저, 에이전트, 콘솔, 파이썬 클라이언트, 설치 스크립트, 스토리지 프록시)에 모두 손을 댈 수 있어 의미 있었고, 특히 Backend.AI 시스템이 어떻게 작동하는지에 대한 큰 그림을 볼 수 있어서 많이 배웠다.

코로나 때문에 인턴 기간 대부분 재택 근무를 했지만 그래도 회사 분위기는 좋았던 것 같다. 래블업 창업자 분들은 너무 뛰어난 실력자들이여서 어떤 질문을 해도 잘 대답해주셨다. 새벽 2시 반에 푸쉬를 하고 다음날 아침 미팅에 나오는 몇몇 분들의 열정도 잊을 수 없다. 기술 기반 스타트업에서의 일은 다른 종류의 스타트업에서 일하는 것보다 더 전문적인 기술과 노력을 요구하지만 그만큼 성취감도 높은 것 같다. 몇 년 째 이렇게 열심히 일하는 래블업 멤버들을 보면서 나의 ‘열심히'의 기준도 같이 높아졌다.