AI 연구/개발자로서 1년을 보내며

AI 연구/개발자로서 첫 1년.. 결과적으로 매우 의미있었습니다.

DT조직에서 AI 조직으로 옮긴지 1년이 넘었다. 왜 옮겼는지 궁금한 분들은 이전 블로그 글에서 확인할 수 있다.

올해는 서비스 적용 가능한 대화 엔진을 만드는데 집중했는데, 생각지도 못하게 서비스에 적용하는 경험도 했으며,엔진의 컴포넌트를 평가하기 위해 참석한 국제 대회에서도 첫 참가에 2등의 성적으로 입상했다. Data Scientist로 오랫동안 일하고 고작 1년만에 이런 결과가 나온데는 같이 일하는 팀원분들의 지원과 노고 덕분이라 생각한다. 여기에서는 이러한 결과를 자세히 정리하고 내년을 계획하는 페이지로 활용하고자 한다.

얻어걸린 훌륭한 동료들…

조직을 옮기고 1년 동안 지내보니 옮기기 전에 전혀 기대하지 못했던….속칭 얻어 걸린게 하나 있다. 그건 바로 훌륭한 동료들이다(관련 글). 획기적인 대화 엔진 개발은 절대 혼자 힘으로 가능하지 않다. 결국 서로의 빈곳을 어떻게 채울것인가인데, 이를 100% 서로 채워준 팀분들의 가치를 올해 많이 느꼈다. 이러한 와중에 다양한 방식으로 개인적인 기회와 위기가 찾아왔지만 결정의 기준이 된건 동료였고, 그 결정은 절대 후회되지 않았다.

BERT는 정말 놀라운 기술입니다.

BERT 논문이 나오는 시점에 팀의 기술 계획이 세워졌는데, BERT를 기반으로 하는 대화엔진 개발이 핵심 주제가 되었다. 그렇게 KoBERT(https://github.com/SKTBrain/KoBERT) 학습을 시작하게 되었다. 일반적인 딥러닝 학습과 BERT와 같은 unsupervised language model의 큰 차이점은 대용량의 데이터가 주어진다는 것인데, 이를 효과적으로 학습하는데 이전의 검색 서비스/엔진 개발 경험은 큰 도움이 되었다.

TPU가 아닌 수개의 V100머신이 있는 상황에서 KoBERT를 어떻게 학습하게 되었는지에 대한 자세한 이야기는 페이스북에 있는 글을 인용하고자 한다.

최근 행사에서 T-Brain 홍보 부스에 와 왜 KoBERT(https://github.com/SKTBrain/KoBERT)를 MXNet으로 학습했느냐 물어보시는 분들이 있다고 들었습니다(이 이야기는 어디서 들으셨는지.. 사실 도구는 중요하지 않아요. 쓸만한걸 만들었냐가 중요하죠). 여기엔 몇가지 이유가 있는데, 말씀 드려보도록 하겠습니다. (참고로 T-Brain은 주로 PyTorch를 연구용으로 씁니다. ^^ 저도 연구용으로 쓰고 있구요. 게다가 PyTorch와 MXNet은 코드 레벨에서 상당히 유사하답니다.)

1. 시기….
팀에서 한국어 버트를 학습하자고 결정한 시점은 작년 12월 말 이었고, 그 당시 TensorFlow를 제외하고 버트의 사전학습을 할 수 있는 공개된 코드가 전혀 없었습니다(Huggingface BERT는 파인튜닝 코드가 공개된 상황이었죠.. 기억으로 올해 1월 말에 사전 학습 코드 비슷한게 나오긴 했는데, 완전한 코드는 아니었습니다). 게다가 TensorFlow의 학습 코드는 TPU에 최적화된 코드여서 보유하고 있던 V100 머신(멀티 노드)에서 학습이 보장되지 않았고, 무엇보다 제가 TensorFlow에 익숙하지 않았습니다. 그렇다면 GCP에서 학습하면 되지 않나 라고 할 수 있는데, 경험상 쓸만한 모델을 만들려면 시행착오를 최소화 한다 하더라도 대략 7천만 ~ 1억 정도 클라우드 비용이 소모될 것으로 예상했습니다. 어찌될지도 모를 작업에 1억을 마련해줄 조직은 없겠죠… 마침 이 시점에 AWS AI팀에서 MXNet으로 버트 학습 코드를 만들고 있었고 제가 버트 사전 학습 데이터 생성 코드를 컨트리뷰트 하면서 함께 작업하게 되었습니다. 드뎌 팀에서 보유한 V100 만으로 멀티 노드 버트 학습을 할 수 있을거 같은 생각이 든거죠(1월 초).

2. 분산 트레이닝 퍼포먼스
MXNet의 분산 학습 퍼포먼스는 초기 개발부터 알려진 바 대로 타 플랫폼에 비해 상당히 좋은 성능을 가지고 있었고, 지금도 그렇습니다. 작업 하면서 같은 하드웨어 환경에서 NVidia에서 공개한 TensorFlow의 throughput보다 10% 이상 좋았으며, Horovod 멀티 노드 학습시 처리 성능의 선형성이 보장되는 모습을 보면서 최적의 학습을 할 수 있었습니다. 역시나 분산 학습 퍼포먼스는 MXNet이었죠.

3. 개인적인 익숙함과 신뢰, 자신감
MXNet 코어 개발자들과의 네트워크가 있어서 어떠한 문제가 발생하더라도 도움을 받을 수 있었습니다. 게다가 엔진 코드 부터 NLP 라이브러리 소스코드 모두에 익숙해 문제에 대한 해결책을 가장 빠르고 정확하게 찾을 자신이 있었죠. 물론 MXNet으로 버트를 학습해 공개하면 많은 사람들이 쓰지 못하겠죠. 따라서 MXNet에서 PyTorch 버트로 컨버터를 만들었고 그렇게 MXNet으로 학습된 모델을 PyTorch 그리고 ONNX로 변환해서 공개한 것입나다.

4. 이해하고 만들면서 쓰자!
버트를 논문 레벨이 아니라 직접 코드레벨로 컨버팅을 하면서 이해하고 싶었습니다. 당시 Masked LM 학습 코드는 좀 복잡하더군요. ㅜㅜ
아마도 이런 시도는 자신감이 아니면 어려웠겠죠. 왜냐면 모델 학습에 실패할 경우 오로지 제가 모든 선택의 책임을 져야 했으니까요. 다행히 2월 한달 동안의 뉴질랜드 가족 여행 중 구동해둔 멀티 노드 학습은 한번도 죽지 않았고(머신은 일하고 개발자는 휴가인….), 돌아와서 정리해 엔진에서 사용하기 시작했죠. 다행히 엔진에서 성능향상이 크게 되고, 이런 저런 케이스에 다양하게 사용되어 성과를 봐 느즈막하게 10월 초에 오픈하게 된 겁니다. 사실 버트 성능은 학습을 할 수록 계속 성능이 오르고 있었는데, ROI 측면에서 중지했습니다. 아마도 여유가 있으면 더 학습을 했을텐데… 연구용 리소스를 무시할 수 없어 정지했네요.

앗 그리고.. 왜 토큰 개수가 8000개냐구요? 여러 토큰 개수로 학습을 시도했을때 초기 학습 성능 향상 속도가 가장 좋았습니다. V100이 수십대 정도 있었다면 토큰을 다양하게 해서 여러 모델을 만들었을 텐데… 그럴 넉넉한 환경은 아니었습니다. 그러나 8000개여서 모델이 조금 가볍다는 것과 그러다 보니 인퍼런스 속도 개선이 있어 엔진 적용시 잇점으로 작용했다는 것입니다. 결과적으로 생각해보면 거의 음절 단위 토큰을 사용한건데, 버트가 학습하면서 음절간의 관계까지 학습한게 아닐까 합니다.

앞으로 MXNet은 계속 사용할 예정입니다. MXNet 개발 엔지니어들과 많은 도움을 주고 받았기 때문입니다. 지금도 제가 무엇이든 요청해도 컨콜까지 하며 도움을 주고 받을 수 있는 네트워크가 있다는건 상당히 큰 잇점입니다. 연말이 되었으니 그동안 쌓인 MXNet 코드를 기여할 때가 된거 같습니다. 작년 크리스마스때 버트에 대한 PR을 처음 보냈는데, 올해도 비슷하게 크리스마스를 보내지 않을까 하네요.

from : https://www.facebook.com/gogamza/posts/10215635213256172

결과적으로 KoBERT를 활용하면서 NLU, QA 등 대화엔진 컴포넌트들의 성능이 크게 향상되었다. 내가 맡은 과거 대화로그를 기반으로 파인튜닝 한 QA의 경우 아래와 같은 답변을 도출했는데, 기대 없이 대충 질문을 던졌던 나로 하여금 큰 충격을 줬던 결과여서 캡쳐해둔 화면이다. 관련 세미나를 하고 데모를 모여주고 난 뒤 몇몇 참석자분들이 이걸로 창업하는거 아니냐는 농담섞인 질문을 하기도 했을 정도였다.

KoBERT 기반의 QA, from ConvAI Prj inteview

T-World Direct라는 판매 채널의 봇에 적용된 모델로 키워드 기반의 QA로는 절대 나올 수 없는 결과를 보여줬으며 수년전에 키워드만으로 존재한 진정한 시멘틱 검색이라 할 수 있을 것이다. KoBERT가 문장의 유사도를 계산하고 이들간의 랭킹을 잘 학습한 결과이다. 이런 경험을 통해 구글 검색의 BERT 활용 기사가 충분히 공감이 갔으며 어떻게 가능했는지 가늠이 가능했다. 내가 지금 검색팀에 있다면 바로 적용할 기술이다.

KoBERT를 오픈하고 이에 대한 많은 관심에 놀랐으며, 지금은 DistilKoBERT와 같은 다양한 파생 프로젝트들이 커뮤니티에서 생성되고 있다. KoBERT의 인기는 이런 모델의 필요성에 대한 대중의 관심과 모델의 성능 덕분이라 생각한다. KoBERT 사례에서 다시 느낀것은 기술 역시 내가 편하고 좋아야 대중도 좋아한다는 것이었다. 앞으로도 내가 만족할 수 있는 기술을 만들 수 있게 노력해야 될 것이다.

딥러닝 대회 2등 내년엔 1등 합시다!

DSTC(Dialog System Technology Challenges)8라는 큰 대회의 여러 트랙중에서 앞서 이야기한 QA 기술과 유관한 Response Selection 트랙에 참석했다. 목적은 아래 세가지 였다.

  1. 엔진 컴포넌트에 대한 객관적인 성능 검증
  2. 대회 결과물의 엔진 적용
  3. 입상(?)

엔진 컴포넌트에 대한 객관적인 성능 검증은 엔진의 서비스 적용시 발생할 수 있는 여러 잡음을 해소할 수 있는 중요한 부분이었는데, 함께 참여한 동료들의 노고 덕분에 결국 위 세가지 모두 달성 할 수 있었다.

이 대회를 거치며 딥러닝 대회에 대한 성격 그리고 노하우를 알 수 있었다. 일단 딥러닝 대회는 데이터와 컴퓨팅 리소스의 제한이 거의 없는 추세이기 때문에 이들에 대한 확보와 효과적 활용이 입상 여부와 큰 관련이 있다. 그렇다 보니 성능 좋은 Language Model 보유 여부가 중요한데, 따라서 내년 대회에 좀 편하기 위해 연말에 이에 대한 준비를 좀 하고 있다.

엔진 컴포넌트 개별의 객관적인 성능을 측정하기 위해 좋은 대회이며, 좀더 확장된 트랙으로 내년에도 참여할 생각이다.

오픈소스에 대한 기여는 곧 나와 대중을 위한 기부….

작년 이맘때 BERT 학습 관련 여러 PR을 GluonNLP에 했으며, 덕분에 2월에 DMLC 맴버가 되었다. DMLC로부터 KoBERT 학습을 위한 여러 도움을 받기도 하고 주기도 했다.

올해 가장 큰 오픈소스에 대한 기부는 KoBERT to GluonNLP 일 것이다. 이미 KoBERT는 MXNet Model zoo에 올라가 있고, 해당 코드 PR은 리뷰중에 있다. API 수정된 부분이 많아 NLP 모델 서빙 API 개선에 대한 논의가 시작되고 있는 상황이다. 이 논의 과정도 너무 재미있고 고민도 재미있다. 게다가 이 사례를 기점으로 운좋게도 조직의 성과와 연결되는 몇가지 협업들이 진행되고 있는 상황이다. 역시 이것도 얻어걸린 거니 묵묵히 잘 도와줄 따름이다.

오픈소스 개발하는 사람은 난 기본적으로 기부자라고 본다. 이는 다른사람이 나를 바라볼때도 마찬가지다. 이는 나를 누군가가 바라볼때 첫인상의 큰 부분을 차지한다. 이런 좋은 첫인상은 결국 좋은 기회로 다가온다.

기업에서 하는 AI연구의 지속 가능성 탐색

DT에서 AI연구로 업무 전환을 하면서 과연 연구와 서비스 개발의 선순환을 만들 수 있을 것인가 스스로 질문을 했다. 왜냐면 기업에서의 연구는 반드시 현실 문제에 발을 딛고 있어야 의미가 있고, 연구가 가질 수 있는 리스크를 줄일 수 있기 때문이었다. 서비스 개발을 하면서 발생한 다양한 도전적인 주제들을 해결하여 서비스에 적용하고 다시 주제를 발굴하는 과정을 통해서 연구와 개발간의 선순환을 만들 수 있을 것이란 가설을 기반으로 올 한해 동안 그러한 선순환이 가능한지 가늠해 보았다. 결국 논문이라는 결과는 도출하지 못했지만, 국제적인 대회참가와 입상 그 결과물을 엔진에 적용하는 과정을 통해 이들간의 선순환이 가능하다는 나름의 결론을 내릴 수 있었다. 아마도 2020년에는 이러한 가설에 대해서 좀더 객관적인 결론을 충분히 도출 할 수 있을 것으로 예상한다.

내년엔…

DT와 AI가 어떻게 다른가? 둘다 경험을 해본 나로서 나름의 정의를 내리자면, DT는 일하는 방식을 변화시키는 방향, AI는 DT를 기반으로 서비스를 변화시키는 기술이라는 차이가 있다고 이야기 하고 싶다. AI는 이를 접하는 사람으로 하여금 Awesome을 느끼게끔 하는게 기본 전제이기 때문에 DT, DevOps, 기획, UI, ML 등을 아우르는 종합 예술이 되어야 된다고 생각한다.

내년엔 이러한 종합 예술의 가시적인 결과를 직접 보고 싶다는 소망이 있다. 이를 위해 대화기술 레벨에서 놀라움에 대한 서포팅을 잘 해야 될 것이다. 물론 대화 기술 자체에 대한 순수가치를 보여주는것도 계속 진행해야 될 부분이라 생각한다.

CC BY-NC 4.0 AI 연구/개발자로서 1년을 보내며 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.