2021년 상반기는 여러 일이 있었지만, 학부 생활을 제외하고는 크게 2가지 카테고리로 정리할 수 있다.
2022년이 넘어와서 상반기 회고를 하는게 웃기기는 하지만.. 원래 2021년 회고를 한번에 하려 했는데, 막상 쓰다보니 너무 내용이 길어져 분리하기로 했다!!
CLOVA AI Rush 2021
지원 과정
사실 개인적으로 머신러닝 스터디를 하면서 의외로 관련 code를 짜 본 경험이 별로 없었다. 내가 kaggle을 나갔던 것도 아니고, 따로 GPU가 있어 model을 자유롭게 개발하고 학습할 수 있는 환경도 아니었고, 무엇보다 매주 1개씩 읽는 논문 리뷰를 따라가는 것만으로도 벅찼다. 그런데, 나는 결국 ML researcher가 아니라 ML engineer가 되고 싶은건데 ML code를 짠 경험이 없다는게 말이 되는건가? 하는 생각이 들었다. 그런 생각과 함께 ML 공부에 현타가 크게 오던 중 때마침 Naver CLOVA에서 주최한 AI RUSH 2021이 개최된다는 소식을 들었다. 2020년에 처음 열리고 두번째로 열리는 competition인데, 이전 행사의 후기가 매우 좋았어서 망설이지 않고 지원했다. 주로 공부했던 NLP 도메인을 활용할법한 문제가 많지는 않았지만 그럼에도 challenging한 문제들이 정말 많아서 이끌렸다. 무엇보다 참가 수행비가 대학생 신분에는 꽤 큰 돈이었고, 실제 competition에서의 순위에 따라 차등지급된다는 점이 동기부여도 많이 될 것 같았다.
서류 전형과 코딩테스트를 거쳐 최종 합격자 150명을 선발했는데, 사실 코딩테스트 문제는 오래 전이라 기억이 나지 않는다. 그래도 커트라인까지 크게 어려웠던 느낌은 아니었다. 내 멋대로 추측해보자면, 일반적인 ML engineer들은 PS를 그닥 열심히 하지 않는 경향이 반영되지 않았나 싶다. 무난하게 합격하고 실제 competition에 참가했다.
competition
1라운드 과제 중 유일한 NLP 과제인 쇼핑 카테고리 분류 문제를 선택해서 집중해 풀었다. 최대 2개의 과제까지 선택해 진행할 수 있었는데, 전략적으로 1개에만 집중했던 것 같다. 기억나는 것이 Vision 과제인 이미지 분류 과제(일반적인 간단한 classfication이 아니라 계층 구조 classification을 수행해야 하는 매우 고난이도 task였다)에 매우 많은 인원이 몰렸었다. 전체 과제는 5개인데 각 과제 당 상위 14명을 선발해 2round로 진출시키는 방식이었기 때문에 인원이 많이 몰리는 과제일수록 경쟁이 훨씬 더 치열했다.
내가 선택한 쇼핑 카테고리 분류는 정말 다행스럽게도 경쟁률이 낮은 편에 속했다. 5월 중순부터 시작해 3주 가까이 1round가 진행되었는데, competetion이 처음이다보니 정말 힘들었다. 맨날 SOTA 논문만 읽다보니 무지성으로 BERT 같은 model 사용하면 될 줄 알았는데 오히려 성능이 하락했다. 며칠동안 별 짓을 다했지만 baseline으로 제공된 아주 간단한 textCNN을 도저히 넘길 수가 없더라. 나중에 채택한 방법은 input text를 1개로 concat하지 않고 각 종류별로 다른 textCNN에 넣어 embedding을 만들어내고, 최종적으로 concat한 뒤 FC layer에 넣는 방식으로 성능을 6% 가량 향상시켰던 것 같다.
종료 일주일 전까지 순위가 내가 꽤 높았었는데, 막판이 되니 다들 더 열심히 달리셨다. 덕분에 탈락 순위까지 추락했고, 나도 부랴부랴 개선을 했다. 결국에는 정말 무식한 방식으로 input text를 속성에 따라 3개로 분류해 각각 별도의 transformer에 넣고, 최종 embedding을 concat 후 FC layer에 넣는 model을 사용했다. 그런데, 이게 솔직히 textCNN에 비해 연산량이 비교할 수 없을만큼 많음에도 불구하고 성능 향상은 0.1% 미만이었다. 일반적인 service에서라면 당연히 textCNN을 사용하는 것이 맞는데, competetion은 score가 높으면 장땡이니까.. 학습만 20시간 가까이 걸리는 정말 큰 model에 대해 hyperparameter search를 하는데, 이게 정말 고역이었다. 새벽에 알람 맞추고 일어나서 새로 학습 돌리고, 엑셀에 parameter와 score 기록하고 하다보니 MLOps의 필요성을 정말 뼈져리게 느꼈다. 좀 더 스마트한 방식을 사용해보면 좋았겠지만, 그 당시에는 학교 생활(시험 기간이었다..)에 AI Rush에, 아르바이트까지 하면서 그걸 고민할 여유조차 없더라.
말그대로 문 닫고 2round 진출 |
마감 전날에 내가 12등이었었다. 그런데 밑에 분들과의 차이가 정말 0.1 ~ 0.2%정도밖에 나지 않았다. 그런데 나는 며칠 째 더이상 score 향상이 되지 않던 정체시기였고, 하루이틀 만에 더 좋은 성능을 달성하는 것도 불가능했다. 한 번 학습에만 20시간 가까이 걸리니까.. 그저 기도만 하고 잠을 잤는데, 당일 일어나보니 내가 14등으로 밀려나있었다.. 턱걸이로 진출하는 등수였는데, 바로 밑의 분과는 정말 아주아주 근소한 차이(random seed만 바뀌더라도 바로 뒤집힐 정도)였고, 나는 더이상 물리적으로 개선이 불가능한 상황이었기에 기도하는 수밖에 없었다. 다행히 이변은 일어나지 않았고, 정말 말그대로 아주 근소한 차이로 문 닫고 2라운드 진출을 했다.
이렇게 간신히 2round에 진출했지만, 나는 결국 2round에는 제대로 참여를 하지 못했다. 제일 간단해보이는 문제 고른 후 baseline에서 학습을 몇 epoch만 더 시킨 뒤 제출할 수 밖에 없었다. 생각치도 못하게 여름 동안 인턴십을 하게 됐기 때문에!!
최종적으로 2round가 종료된 시기는 내가 인턴십하던 도중이었는데, 감사하게도 주최측에서 굿즈도 보내주셨다. 디자인도 정말 이쁘고 아직까지 잘 사용하고 있다!!
goods
텀블러와 티셔츠가 정말 이쁘다. |
Kakaobrain Internship
KakaoBrain |
지원 과정
카카오브레인이라는 회사에서 인턴십을 모집한다는 걸 들었다. 사실 이 전부터 네이버 / 카카오 채용 공고에 올라오는 인턴십 중 NLP 도메인 관련된 포지션은 대부분 지원해봤었다. 그 중에는 면접까지 간 것도 2번 있었지만 사실 내부추천으로 인해 면접까지 간 것이었고, 그 외에는 모두 서류 전형에서 탈락했다. 이 때 느낀 점이 일반적인 학사 커리큘럼을 밟고 있는 사람을 원하지는 않는구나 생각했다. 석사 과정 등으로 이미 랩실 소속이거나, SKP 같은 학력은 갖고 있어야 서류를 통과한다는 느낌을 받았다.(물론 이제와서 생각해보면 그 당시의 내 서류나 스펙이 형편없어서일 가능성이 가장 크다.) 그래서 카카오브레인 역시 지원은 했지만 사실 별 기대도 안했다. 특이했던 점이 지원 단계부터 5개의 프로젝트 중 1개를 선택해 지원하는 것이었는데, 내가 주로 공부하던 NLP 도메인의 프로젝트는 전혀 없었고, 그나마 관련이 있을 거 같은 multi-modal인 CLIP을 활용하는 프로젝트에 지원했었다.
1차 코딩테스트는 4시간이 주어지고, 따로 캠과 같은 제약 없이 자유롭게 문제를 풀 수 있었다. 검색도 가능했었는지는 기억이 나지 않는데, 나는 따로 검색을 하지는 않았다. HackerRank 플랫폼에서 진행되었고 총 4문제였는데, 1~2문제는 난이도가 은근 있어서 고역이었다. 최종적으로 다 풀기는 했었는데, 마지막 문제가 1개의 case에서 자꾸 timeout이 나는 상황이었다! python으로 code를 짰었는데, 최종적으로 10분 남기고 C++로 언어를 변경하는 시도를 했고 3분 남기고 code 작성을 완료한 뒤 테스트해보니 다행히 통과했다! 역시 C++이 빠르다..ㅎ
2차 코딩테스트는 프로젝트에 따라서 논문을 갖고 토론을 진행하기도 하고, 과제 형식으로 나오기도 하고, 논문을 읽고 프레젠테이션을 하기도 한다고 안내를 받아서 걱정을 많이 했었다. 다행히 1주일동안 수행하는 과제를 받았는데, colab notebook 링크를 준 뒤, 이를 완성하는 내용이었다. 자세한 문제를 말할 수는 없지만, 정말 처음 보는 분야에 관한 내용이었고, 실험 및 결과 리포트를 작성해야 했기에 matplotlib 등을 사용해 이쁘게 plot하는 것도 필요했다. 처음에 3일동안은 문제가 뭘 요구하는지조차 파악을 하지 못해 멍때리기만 했던 것 같은데, 관련 논문을 1개 찾고 난 뒤 점차 구체화가 되기 시작했고, 결국 2일동안 논문을 찾아 읽고 최종적으로 2일동안 code를 급하게 짰었다. 그래서 code 품질이 그닥 좋지 않았던 것으로 기억한다.
2차 코딩테스트인 과제를 정말 주먹구구식으로 수행했고, 내가 접근한 방법이 맞는지에 대한 판단 조차도 되지 않아서 당연히 탈락할 것이라고 생각했었다. 그래서 합격 메일을 받고 정말 놀랐었다. 동시에 면접에서 관련 내용 질문이 정말 많이 들어올텐데, 이걸 어떻게 답변하지 싶었다. 그래서 논문이나 한 번 더 읽고 따로 준비를 안했었다. 면접은 2:1로 1시간동안 진행되었는데, 정말 편안한 분위기에서 진행되었고, 다들 진심으로 좋으신 분들이었다. 한 면접관 분은 내가 무슨 이야기를 하더라도 웃으며 받아주셨고(주니어 우쭈쭈 받는 느낌), 한 분은 완전 포커페이스이셨다. 내가 생각했던 것과 면접이 좀 다르게 진행되었는데, 과제에 대한 질문이 있기도 했지만 비중이 크게 높지 않았다(나중에 듣고 보니 내가 잘 모른다는 것을 진작에 파악하시고 더 깊게 안물어보셨더라). 기초 CS 질문도 들어오고, 상황 가정이 주어지며 그에 대한 해결책 제시와 반론을 주고받는 형태였다. 정말 내가 알던 분야에 대한 질문이 아니어서 최대한 알고 있는 지식을 영끌해가며 헛소리를 나열했던 것으로 기억한다. 면접관 분께서 나의 해결책에 대해 납득이 가는 반론을 계속 해주셨었기에, 당연히 나는 광탈이겠구나 생각했다. 그래서 주변에 무조건 탈락이다, 좋은 경험이었고 많은 부족함을 느꼈다는 후기를 이야기하고 다녔고, 실제로 여름에 제주도 놀러가는 비행기까지 끊어놨었다! 절대 합격할 일이 없겠다 생각했기 때문에.
전산 오류? |
나는 합격 메일을 받고 진심으로 다른 사람과 착오가 생겨 메일이 오발송된 것이 아닐까 의심했다. 도대체 면접에서 뭘 보고 합격한거지? 채용연계형이기에 이대로 전환까지 성공한다면 취준이 끝나는건데, 이렇게 빨리 취준이 완결날 줄은 몰랐다. 그당시 나는 최소 1년은 더 바라보고 있었으니까..
카카오브레인?
닉네임은 wilson.bear 였다 |
M1 13인치 Pro CTO. 그 당시 최고급 모델을 받았다. |
첫 날 온보딩이 끝난 뒤, 배치된 팀인 Large-Scale TF에 가게 되었다. 팀원분들은 모두 다 재택근무 중이셔서 얼굴을 볼 수 없었고, 팀 리더님만 출근하셨다. 면접 때 내가 무슨 이야기를 하더라도 웃으며 받아주시던 면접관이셨다! 이후 인턴십 기간 동안 다른 분들은 거의 뵙지 못했고, 리더님이 인턴십 멘토까지 겸하셨기에 정말 자주 소통했던 것 같다. 맛있는 밥도 많이 사주셨다!!
판교 최고 맛집 서호돈가스. |
간략하게 카카오브레인 이라는 회사에 대해 소개하자면, “카카오 공동체의 AI 스타트업” 이라고 정리해 볼 수 있을 것 같다. 내 멋대로 정의이기도 하지만, CEO이신 curtis를 포함해 많은 사내 크루 분들이 카카오브레인은 스타트업의 특성을 갖는다고 말씀하신다. 스타트업은 어느정도 리스크가 있기는 한데, 카카오브레인의 경우 카카오라는 든든한 뒷배가 있다는 점이 차이가 있을 듯! 사실 입사 전에 알고 있던 카카오브레인의 이미지는 “신비주의 엘리트 연구 조직”
이었다. 실제로 내가 지원하던 당시에도 AI업계 종사자가 아니라면 존재 조차도 모를 정도로 크게 알려지지 않았는데, 요새는 공격적으로 브랜딩을 하고 있는 것 같다. 회사 규모는 정말 소규모로, 매우 뛰어난 분들이 동료로 계셨다. 엘리트 느낌은 확실히 많이 났다! 그래서인지 내가 있을 곳이 아닌가..? 하는 생각을 인턴십 내내 갖고 있었다. 사실 연구조직이라는 표현은 반은 맞고 반은 틀린 이야기인데, 이전까지는 주로 연구자 분들이 많은 비중을 차지하고 있었지만, 최근 뛰어난 AI 기술력을 활용해 다양한 서비스를 개발하고 이를 출시하는 방향으로 회사의 방향이 바뀌었다는 점에서 연구만 하는 회사는 절대 아니다.
H스퀘어의 명물인 마스크 쓴 라이언 |
카카오브레인은 사실 구직자에 있어서 정말정말 좋은 회사이다. 인턴십 도중 만난 모든 크루 분들에게서 조금도 위계적인 느낌을 받은 적이 없을 만큼 수평적인 분위기이다. 완전 자율 출근 및 재택 근무를 시행하는 것도 장점이다. 코로나 이후에도 재택 근무를 하는 것으로 알고 있다! 유급 휴가도 연간 25일을 무조건 지급하고, 그 이상의 무급 휴가도 무제한으로 사용 가능하다. 가장 충격적인 것은 출퇴근 시 택시비를 조건없이 지원하는 것이다. 인턴에게도 개인 법인카드를 지급하고, 어떤 번거로운 결재 절차를 요구하지도 않았다. 첫날부터 출퇴근 택시비를 지원해줬는데, 이후 출퇴근 시에 앞으로도 모두 택시비를 지원해준다고 해서 정말 놀랐었다! 당시에는 잘 몰랐지만 다른 어느 회사를 가더라도 받을 수 없는 최고의 복지였다👍👍 덕분에 두 달 내내 정말 편하게 출퇴근을 했다. 그 외에 여타 회사의 인턴십 대비 높은 급여를 봤을 때, 직원 처우에 있어서도 업계 최고 수준을 지향한다고 느꼈다.
인턴십 프로젝트
인턴십 기간 동안 내가 정말 아무것도 모르는구나 느꼈다. 도대체 학교에서 뭘 배웠던 걸까 반성도 많이 했다..ㅎ 부끄럽지만 그 당시의 나는 REST API도 스스로 짜 본 적이 없었고, Web Server / WAS 차이점도 몰랐고, flask로 간단한 html 페이지 띄우는 것부터 애를 먹는 수준이었다. 차근차근 단계를 밟아나갔는데, 리더님께서 방향을 잘 잡아주시고 공부할 keyword를 계속 제공해주셔서 그나마 포기하지 않고 할 수 있었던 것 같다. 프로젝트의 목표 명세는 정말 구체적이었는데, 처음에는 내가 두 달 안에는 도저히 완성 불가능한 볼륨이라고 생각했다. 이미지 검색 시스템을 만드는 것 자체도 정말 힘들 것 같은데, data의 개수가 billion(10억) scale에 근접해야 하고, 그러면서 동시에 빠른 검색 속도도 보장해야 했다. 하지만 리더님은 차근차근 진행해나가면 충분히 가능하니 걱정하지 말라고 격려를 해주셨고, 실제로 가능하도록 구체적인 스케쥴(각 컴포넌트 별 deadline)까지 제시해주셨다.
사실 내 스스로의 실력이 터무니없이 부족했고 모르는게 너무 많아서 답은 시간을 갈아넣는 것밖에 없었다. 리더님께서 큰 방향은 잡아주시지만, 그렇다고 “구체적으로 어떻게 하라”며 떠먹여주시는 분은 아니셨기에 내가 여러 선택지에 대해 모두 실험을 하고, 그 결과를 바탕으로 의사 결정을 해야 했었다. 이 과정에 수많은 삽질은 필수적이기에 자연스럽게 많은 시간이 소요되었다. 그래서 내가 선택한 방법은 퇴근 후 집에 와서도 새벽까지 개인적으로 계속 공부한 거다. 누군가 강제한 것도 아니고 스스로 필요성을 느껴 한 공부였다. 당시 체력적으로 무리일만큼 많은 시간을 투자했었는데, 2개월 동안은 정말 24시간 내내 프로젝트 생각만 했던 것 같다. 그래도 정말 즐거웠다. 과정 하나하나가 재미있었고, 내가 많은 성장을 해나가고 있음을 스스로 느낄 수 있었다. 다시 돌아가서 하라고 한다면 잠자는 시간을 더 줄여서라도 퀄리티를 높여보고 싶다.
프로젝트의 최종적인 결과물은 다음과 같다.
한국어에 대해서도 잘 검색해준다. |
감사하게도 리더님께서 인턴십 프로젝트 기획 단계부터 인턴이 끝나고 나더라도 개인 포트폴리오로 활용할 수 있도록 설계를 하셨었고, 사내 검토까지 완료가 되었다. 덕분에 내가 인턴십 도중 작성한 code를 외부에 공개하며 포트폴리오로 활용할 수 있었다. 물론 사내의 dataset(10억건 이상)은 사용할 수 없지만, google의 openimages v6 dataset의 2M(200만)개의 image dataset을 활용해 소규모 demo를 운영하고 있다.
위의 간략한 프로젝트 소개를 보고 의문이 드는 사람도 꽤 많을 것 같다. 10억건에 가까운 billon scale이 말이 쉽지, 정말 어마어마한 볼륨인데, 도대체 이걸 어떻게 개발했다는 것인지? 사내에 이정도 규모의 서비스를 개발할 환경이 되기는 하는가? 결론부터 말하자면, 카카오브레인은 가능하다. 밖에서 일반적인 기업(톱 IT 서비스 기업들 포함)해 이정도의 Infra가 구축된 곳은 손에 꼽을 것 같다. 더군다나 이를 고작 인턴에게 모두 사용하도록 공개하는 경우는 내 주변에서는 들어보지를 못했다. 내부에서 개발한 머신 러닝 학습 플랫폼인 BrainCloud가 있는데, GPU가 상상도 할 수 없을 만큼 많이 달려 있고, 이를 자유롭게 사용 가능하다. 일반적으로 ML 학습에 많이 사용한다는 GPU인 V100은 BrainCloud에서는 남아도는 자원이다. 그보다 훨씬 값비싸고 좋은 GPU인 A100을 사용하면 되니까. 나의 경우에는 image dataset에 대해 CLIP embedding을 추출할 때 A100이 8대 달린 instance 4대를 동시에 사용했다. 그러니까, A100 GPU를 32개 동시에 사용한 거다.
상상을 초월하는 GPU 가격.. |
사내 BrainCloud에서는 각 계정마다 월별 사용 금액이 산정되어 나온다. 말도 안되는 스펙의 인스턴스를 잔뜩 할당받을 수 있던 나는 너무 신나서 금액은 신경도 안쓰고 사용했었는데, 월 말이 되어가니 내가 사용한 금액이 300만원 가깝게 산정되었다. 이걸 확인하고 걱정되어 리더님께 너무 많이 사용한 것 같아 걱정된다 말씀드렸더니, 최소 1천만원은 넘게 사용해보고 그런 말을 하라고 하셨다. 이정도 사용하는 걸로는 아무도 신경안쓴다고! 더 놀라운 점은 BrainCloud는 사내에서 개발한 솔루션이기 때문에 AWS, GCP 등 외부 cloud에서 사용하는 것 대비 금액이 훨씬 저렴한 금액으로 산정이 된다. 결국 정리하자면, 밖에서는 경제적인 이유로 꿈도 못 꿀 자원을 인턴십 내내 너무 자유롭게 사용한 것이다. 어디서도 하지 못할 좋은 경험이었다.
Kakaobrain Facebook에도 간략한 회고를 남겼다!
이렇듯 인턴십은 매우 좋은 경험이었지만, 결과적으로 채용 전환이 되지는 못했다.. 사실 기대를 안했다고 하면 거짓말이지만, 스스로 부족함을 정말 많이 느꼈기에 당연한 결과라고 생각했다. 카카오브레인의 크루들은 한 분 한 분이 모두 다 기술적인 깊이가 뛰어난 분들이셨기에, 설령 운이 좋아 내가 전환이 되었다 하더라도 내가 이 분들과 함께 제 몫을 해나갈 수 있을까 하는 걱정이 되기도 했었다. 주변에 일반적인 학사 졸업 후 공채 등으로 입사한 신입(주니어) 개발자를 보지 못했던 것도 크다(물론 재택으로 대부분이 출근하지 않으셨기에 내가 만나지 못한 것일수도 있다). 프로젝트 목표는 어느정도 유의미하게 달성했다고 생각하지만, 부분적으로 미흡한 지점도 있고, 무엇보다 목표 기대치를 뛰어넘는 지점이 특출나게 있지는 않았다. 개인적인 의견으로는 카카으브레인과 같은 조직에서 함께하기 위해서는 일반적인 목표치 달성은 물론이고, 그를 뛰어넘는 outstanding point가 있어야 하지 않을까 싶다! 또 프로젝트 진행 과정에서 내가 기초적으로 미흡한 부분이 많았기에 그러한 점에서 부족하다는 평가를 받았을 것이라 추측한다.(지금은 그 때보다도 더 성장했다ㅎㅎ) 신입을 볼 때 가장 크게 보는 지점이 잠재력이라는 이야기를 많이 듣는데, 결국 잠재력이라는 것은 신입이 충분히 성장하기까지 조직에서 기다린 뒤에야 발휘될 수 있는 것이고, 생각보다 많은 리소스가 투입되는 지점일 수 있겠다. 회사 입장에서 이를 감수하고서라도 기다릴 만큼 이후가 기대되는 주니어여야 하지 않을까??
채용 전환이 되지는 못했음에도 나는 카카오브레인에서의 인턴십을 절대 후회하지 않는다. 오히려 인턴십이 너무 짧아 많은 경험을 하지 못한 점이 아쉬울 뿐이다. 카카오브레인에서 “패스파인더”와 같은 주니어 육성 프로그램을 운영하는데, 앞으로 매년 주기적으로 열릴 계획이라고 한다! 나는 주변 후배 분들께 많이 지원해보라고 강력 추천하고 있다. 카카오브레인에서의 인턴십이 정말 너무 좋은 경험이었으니까.
하반기 회고
하반기 회고는 다음 포스트에 작성했다.