지난 2월 온전히 1개월을 모두 뉴질랜드 가족여행에 쏱아 붓고 있던 중 뉴질랜드 푸카키 호수 마운트 쿡 빙하 아래 있던 (전화도 잘 터지지 않던)오지 캠핑장에서 작은 메일을 받았다. DMLC에 초대를 하고 싶다는 메일이었다.
DMLC(Distributed (Deep) Machine Learning Community )
DMLC는 대표적으로 데이터 사이언스를 한다면 알고 있을 xgboost를 만든 개발자 집단이라 보면 된다. xgboost는 지금도 그렇지만 케글과 같은 대회에서 우승자들이 많이 사용했던 트리 기반의 앙상블 머신러닝 패키지다. 이 이외에 gluon-nlp, gluon-cv 등과 같은 딥러닝패키지들이 존재하고 있다. 몇몇 관련 프로젝트를 Amazon에서 지원하고 있기 때문에 다수의 Amazon 개발자들이 참여하고 있는 상황이다.
DMLC의 맴버가 된다는건 이러한 커뮤니티가 필요할때 서포팅을 받거나 줄 수 있게 되었다는 걸 의미한다.
어떻게 초대를 받았나?
NLP를 해본 사람들은 알겠지만 그 특유의 전처리 로직의 다양성 덕분에 코드의 유지도 힘들 뿐더러 연구 재현도 잘 안된다 이런 고충을 해결하고자 만들어진게 gluon-nlp다. 개인적인 취미 혹은 연구, 학습 목적으로 gluon-nlp를 자주 사용해왔고, 그러다 보니 자연스럽게 코드레벨에 접근하는 경우가 많아서 이미 코드 레벨의 이해도는 어느정도 준비된 상황이었다. 무엇보다 이 프로젝트 코드의 퀄리티가 상당히 좋아서 코드 읽는 재미가 있다.
다른 NLP패키지도 많지만, gluon-nlp를 선택해 사용한 이유는 이 패키지의 목표가 다수의 NLP 모델과 전처리 로직을 재현성 가능하게 만들어가는데 초점을 맞추고 있어서이다. 딥러닝 프레임웍 코드가 달라지는데, 모든 커뮤니티 서포팅 기반의 딥러닝 모델 구현체들이 재현성을 유지하는건 힘들다. 물론 gluon-nlp도 커뮤니티 서포팅 기반이나 AWS의 풀타임 엔지니어들이 핵심적인 부분을 차지하고 있고, 이러한 모델 재현성 관리가 AWS 클라우드 기반 모델 개발에 반드시 필요할 것이라는 예상을 해서이다. 클라우드 사용자들이 마음 편하게 모델을 가져다 쓰기만 할 수 있는 환경을 NLP에서도 만들어 두는게 필요할 것이다.
여튼 gluon-nlp를 사용하는 재미, 읽는 재미가 충만한 상태였으며, 패키지의 목적도 너무 맘에 들어 2018년 말까지 코드 컨트리뷰션을 하고자 계획했다.
물론 이 컨트리뷰션의 동기는 DMLC 맴버가 되는게 아니였다. 어떻게 이런걸 기대했겠나? 하지만 아래에 언급한 몇몇 이슈를 제기하고 코드를 컨트리뷰션하고 여러 기술적인 논쟁을 거치며 맴버가 될 수 있었다.
첫번째 이슈 제기
구글이 BERT 코드를 공개한 이후 몇몇 딥러닝 프레임웍 커뮤니티에서 BERT를 포팅해서 사용할 수 있게 하였다. 물론 gluon-nlp에서도 발빠르게 이를 지원했는데, 재현성 측면에서 검증이 제대로 되지 않았다는 판단이 들었다(물론 TensorFlow, PyTorch 버전의 BERT 역시 GLUE의 모든 테스크에 대해서 성능 재현코드가 없는 상태였고, 지금도 여전히 그렇다). 그래서 이에 대한 이슈를 제기했다. 결국 다른 곳에 없는 코드를 구현해야 되는 이슈였다.
GLUE에서 소개한 데이터 기반의 테스트 프레임은 BERT 뿐만 아니라 앞으로 많은 모델에서 사용될 것이기 때문에 이 부분에 대한 구현은 매우 중요해졌고, 이 코드의 베이스 코드를 컨트리뷰트 하게 되었다.
두번째 이슈
연말에 업무 때문에 BERT를 학습해야 되었는데, 마침 해당 이슈(BERT 학습셋 생성 모듈)가 gluon-nlp에 등록이 되어 있어서 함께 진행했다.
“어 회사 업무로 오픈소스 컨트리뷰션 해도 되나요?”
위와 같은 질문이 나올 수 있는데, 해당 업무는 리더의 승인을 얻어서 진행했다. 설득의 포인트는 “코드 리뷰”였다.
구글의 공개된 코드 베이스로 진행해서 큰 어려움은 없었으나, tfrecord에 대한 대안 모듈에 대한 이슈 등으로 gluon-nlp 커뮤니티 내에서 논의가 있었다. 결국 회사에서 쓸 모듈과 gluon-nlp에 컨트리뷰트 한 모듈을 달리 구축했다. 이 작업을 하면서 대용량의 학습셋을 어떻게 구축하는게 최적인지 많은 혜안을 얻을 수 있었고 이 고민 덕분에 학습셋 확장과 멀티 노드 딥러닝 학습을 하는데 큰 도움이 되었다.
결국 회사에서 딥러닝 트레이닝에 쓸 코드를 만드는데 훌륭한 외부 엔지니어의 리뷰를 받을 수 있었던 것이고, 결과적으로 많은 시행착오를 줄일 수 있었다.
딥러닝 코드는 버그를 발견하기 어렵고 디버깅 하기 쉽지 않아서 이런 리뷰를 받는건 일반적인 소프트웨어 개발에서의 리뷰보다 큰 도움을 준다.
몇몇 도움 그리고 merge
BERT MaskedLM 모듈 등의 버그를 다른 사람의 코드를 리뷰해주면서 고칠 수 있게 도움을 줬다. 물론 이런 과정을 통해 내 생각과 의견을 검증할 수 있었다.
이와 같은 작업들을 2018년 12월 말 크리스마스 ~ 연말 휴가 즈음에 진행했는데, 크리스마스 휴가는 스타벅스에서 코딩하면서 보냈고, 연말 역시 다수의 git 브랜치를 오가며 코딩하기 여념이 없었다. 1월에 업무가 바빠지면서 주중엔 신경 쓰지 못하다가 패키지 릴리즈 포커스를 받게 되어 주말작업을 통해 마침내 master에 머지 되었다.
오픈소스로 공인 실력을 키우자
필자가 만나는 모든 역량있는 개발자들이게 오픈소스 개발에 기회가 되면 참여하라고 이야기한다. 그 이유는 개인의 성장과 경력 관리에 있다. 개발자에게 오픈소스 개발 실적은 흡사 영어 공인 성적표와 같은 의미라 생각한다.
하지만 이 과정이 쉽지 않고, 무엇보다 시간이 많이 소요된다. 따라서 두가지 방안이 존재한다.
- 오픈소스에 투자할 시간을 늘린다.
- 실력을 키운다.
일단 두 가지 조건중 최소 하나 이상 충족되지 않으면 오픈소스 기여는 쉽지 않다. 재밋는 사실은 기여하면 할 수록 1번의 중요성이 적어진다는 것이다. 이는 개인의 실력이 늘어난다는 것을 의미한다.
1번조차 어려운 분들에게는 일단 워라벨이 어느정도 보장될 수 있는 업무나 직장으로 옮기라 추천하고 싶다. 🙂 잠을 줄여서 하겠다라면 말리진 않겠지만 반드시 건강이 상하게 되니 주의해야 된다.
GitHub은 코드로 말하고 답하는 SNS다. 모든 컨트리뷰트가 로깅되고 코드에 기억된다. 코드 한줄에 많은 고민과 질타가 함축되고 이를 통해 배우게 된다. 여길 방문하는 많은 분들도 이런 경험을 해보시길 추천드린다.
난 항상 딥러닝 모델 혹은 프레임웍에 문제가 있을때 도움받거나 줄 수 있는 동료풀이 있다고 이야기한다. 그 동료는 회사의 동료들도 포함이겠지만 이 보다 더 많은 딥러닝 개발자가 있는 DMLC를 염두에 둔 것이다.