[boostcamp] AI Tech 5기 (NLP) 전체 기간 회고

TrainToGPB·2023년 8월 5일
0
post-thumbnail

되돌아보며

세 줄 요약

  1. 한 만큼 얻었다: 지식, 경험, 사람 등등
  2. 더럽게 힘들었고, 그보다 3배 정도 재미있었다.
  3. 후회는 없다. 이제 취업만 잘 한다면...

유의사항

  • 투머치토커라서 글이 꽤나 길다.

  • 수료 이후 지원 이전 시점부터 돌아보며 쓰는 글이기 때문에, 초반 부의 이야기는 기억이 휘발되고 남은 감상들 위주다.

  • 자세한 커리큘럼에 대한 이야기는 절대 공개된 곳에서 하지 말라고 부캠 시작부터 굉장히 강조했는데, 사실 자세한 커리큘럼이 어느 정도의 범위인지 모르겠다. 최대한 디테일을 뺴고 서술하려 노력했다. 회고 쓰는데 이정도는 쓰게 해줄 수 있잖아.

지원 계기

[지원 계기] 학부생 시절

  • 나는 작년까지 장래희망이랄게 없던 사람이었다. 고등학교 때도 애매한 학군의 애매한 내신을 가진 학생이었다. 다행히 수학은 좋아했기에 수리 논술이 적성에 맞았지만, 꿈이랄게 없으니 그냥 '사람 많이 뽑는 학과'들에 지원했었다.

  • 학교에 다니는 4년 정도면 어디든 갈 길이 자연스레 보이리라 생각했었고, 당연하게도 그렇지 않았다. 20대 중반에 들어서도 가고 싶은 회사는 커녕 내 학과를 졸업한 사람들이 정확히 무슨 일을 하는지도 잘 몰랐다.

  • 그러다 친한 동기에게 제안받은 고액 알바, 학부연구생을 시작으로 흘러흘러 대학원까지 가버렸다. 세부 전공이라도 있는 사람이면 좋든 싫든 그 일 하면서 먹고 살 수는 있겠지, 이런 나이브한 마인드였다.

[지원 계기] 대학원생 시절

  • 내가 입학한 연구실은 (당시) 30대의 젊은 교수님이 이끄시는 신생 연구실이었다. 젊은 교수님답게 토목이라는 낡은 분야에 기계학습을 일찍부터 도입하려 하시는 분이었다. 이 과정에서 말로만 듣던 AI라는 것을 처음 배우게 되었고, 이때부터 괴리감을 크게 느꼈다.

  • 토목은 공과대학 안에서도 가장 오래되고 보수적인 학문이다. 발전이 빠를 필요도, 혁신을 쉽게 수용할 필요도 없는 분야다. 나쁘다는 것이 아니라 분야 특성상 그렇다. 다만 그런 공학과 세상에서 가장 빠르게 발전하고 있는 공학의 접목을 연구하는 것은 괴로운 일일 수 밖에 없다.

  • 그러면서 장래희망이 생겼던 것 같다. 세상이 빠르게 변하고 있고, 나는 그에 대해 배우고 있는데, 정작 제대로 활용할 기회가 없다는 생각이 들었다. 그리고 결국 20대 후반에 접어들어서야 제대로 된 장래희망이 생기고, 진로를 바꿔야겠다는 결심이 섰다. 사실 제대로 말하자면, 이제야 진로를 선택했다는 표현이 조금 더 맞는 것 같다.

지원

[지원] 지원 준비

  • 그런 생각이 든 이후로 내가 갈 곳은 부스트캠프 뿐이었다. 마음 같아서는 석사를 다시 하고 싶었지만 현실적으로 어려운 부분이 많았다. 마침 지원 기간도 맞았기에 빠르게 지원 절차를 밟았다.

  • 프리코스는 수월했다. 양이 많기는 했지만 사실 대학원에서 배운 기초 지식이 대부분이었고, 처음 보는 내용은 거의 없었다.

  • 문제는 코딩 테스트였는데, 파이썬을 찍먹 정도만 해본 나에게 알고리즘이란 것은 처음에 꽤나 당혹스러웠다. 그래도 한 달 정도 유튜브 강의도 듣고 프로그래머스 문제를 120개 정도 풀어보니 감이 오는 것 같긴 했다. 물론 Lv.3 문제는 거의 손도 못대는 수준이라 걱정이 크긴 했다.

[지원] 테스트

  • 이후 두 번의 테스트를 거쳤다. 첫 번째 테스트는 이론 + 기본 코딩 테스트로 구성됐었고, 무난하게 통과했던 것 같다. 두 번째로는 조금 더 난이도 있는 코테로 진행됐고, 이때 마음이 꺾였다. 8문제 중에 4.5문제 정도를 풀었고 그마저도 확실하지 않았다. 앞으로의 미래 걱정에 심란해져 테스트 직후 지원자 오픈 채팅방을 나가기까지 했다. 그리고 최종 발표날 합격 메일 받고 나서야 다시 들어갔다.

[지원] 온보딩 및 NLP 트랙 선택

  • 합격자들에게 온보딩이라는 이름으로 몇 개의 공지와 교육 초반 강의가 미리 열렸다. 양이 정말 많기는 했지만, 여전히 기초를 다뤘기에 무리없이 학습했던 것 같다.

  • 아마 지원할 때 한 번, 온보딩 이후 한 번 수강 트랙을 선택하게 되었던 것으로 기억을 한다. 자소서를 처음 쓸 때부터 트랙 선택에 고민이 좀 많았는데, NLP로 선택한 기준이 몇 있었다.

    1. 앞으로의 취업 시장의 파이
    2. 대중들이 가장 많이 접하게 될 AI
    3. 유행일지언정, 유행이 지나도 가능성이 큰 기술

    추가로, 온보딩 시작과 동시에 ChatGPT라는 거대 NLP 서비스가 슬금슬금 뉴스를 타기 시작했다. 선택에는 운도 꽤 많이 따른다.

Lv.1

[Lv.1] 이론 학습

  • 새 학기 시작과 동시에, 부스트캠프 Lv.1이 시작됐다. 아직도 첫 날의 멘탈이 기억난다. 주간 학습 일정, 교육 수칙 등 긴 공지가 대략 10개 정도 올라왔고, 강의는 무려 20개가 올라왔다. 물론 프리코스와 온보딩 때 들었던 강의가 다수 포함돼 있었지만, 첫 날의 정신 없음은 이루 말할 수 없었다.

  • Lv.1은 대부분 이론 강의와 실습, 그리고 과제로 구성돼있었다. 강의도 강의지만, 매주 실습과 과제에 대한 진행도도 체크됐기 때문에 양적인 압박이 꽤 심했다. 특히 수료생이라면 모두 알고 있을 '부덕이'가 2주차에 등장하면서부터, 집 밖을 나가지 못하는 생활이 익숙해졌던 것 같다.

  • 이때는 설렘과 긴장에 피로까지 잊었다. 집 데스크탑 WSL에 SSH 연결한다고 거의 2주 가까이를 새벽 3시에 자기도 하고, 그 와중에 PS 연습도 하고, 논문도 주마다 1개씩 읽었다. 적고보니 새삼 정말 열심히 했구나 싶다.

[Lv.1] 대회

  • 이후 마지막 2주 정도에 첫 리더보드 프로젝트를 경험했다. 그 전 6주 동안 이런저런 학습을 같이 한 팀원들에 대한 어느정도의 신뢰가 있었고, 정말 기대를 많이 했었던 것 같다. 그리고 이 대회의 첫 1주가 지나가면서, 부캠 최대의 위기를 겪게 된다.

  • 팀원 중 한 분이 대회 시작과 동시에 경주마로 돌변했고, 1등에 집착하기 시작했다. 그 분은 이전에 대회나 프로젝트 경험을 어느정도 해보신 분이었는데, 문제는 본인의 진척도에 대해 공유할 생각을 잘 안했다. 1주일 쯤 지나자 그 격차가 너무 벌어져 팀 학습에 의미가 거의 없어졌다.

  • 표면적으로 드러내지는 않으려 노력은 했지만, 이때는 화병으로 잠도 제대로 못 잤다. 비전공자로서 매 순간 효율적으로 남들보다 더 많이 배워야한다는 조급함까지 더해져, 멘탈 관리가 거의 안됐다. 아마 마지막 쯤엔 표정 관리도 안 됐던 것 같다.

  • 그래서, 여차저차 첫 대회를 마무리지었지만 이때 기술적으로 배운 부분이 많이 없다. 기껏해야 cross validation이나 hyperparameter tuning 정도를 시도했으며, 당연하게도 팀 최고 점수 갱신은 해보지 못했다. 지금 생각해도 정말 아쉬운 부분이지만, 그래도 남은 Lv.2 & Lv.3 기간을 함께 했던 두 번째 팀원들이 정말 좋았기 때문에 그에 대한 액땜이었구나 생각한다.

Lv.2

[Lv.2] 팀 선정

  • 랜덤 배정이었던 Lv.1과 다르게, Lv.2부터는 구인구팀 과정을 거쳐 직접 조직한 팀으로 진행하게 됐다. Lv.3 최종 프로젝트까지 같이 가야하는 팀원들을 만나야 했기에, 각자 원하는 최종 프로젝트의 주제의 결이 비슷한 사람들을 찾았다.

  • 사실 ChatGPT의 등장으로, NLP 트랙 캠퍼들은 최종 프로젝트 주제 선정에 꽤 많은 어려움을 겪었다. ChatGPT가 하지 못하는 것을 찾아야 했고, 자연스레 멀티모달리티가 화두가 되었다. 의외였던 것은 '음성'을 활용한 프로젝트를 제안한 사람이 꽤 적었다는 것인데, 그 중 하나가 나였다.

  • 뭐가 되었든 STT(speech-to-text)를 사용하는 프로젝트를 해보자고 다섯 명이 모이게 되었다. 구인구팀 당시 Lv.1 팀원 분 중 한 분이 팀을 고민하고 계셔서 같이 가게 되었는데, 부캠하면서 참 잘한 선택 중 하나라고 생각한다. 내가 사람보는 눈은 있구나 싶었다.

[Lv.2] 첫 번째 대회

  • Lv.2는 본격적으로 대회의 연속이었다. 3개의 리더보드 대회를 연속해서 진행하게 되는데, 체력적으로 정말 많이 갈렸고, 늘 그렇듯 갈린만큼 많이 배웠다. 파이썬, 파이토치, 허깅페이스, 깃 등의 제대로 된 활용법을 이때 대부분 익혔고, 대회를 진행해나가면서 모델링이 익숙해져가는 것이 상당히 즐거웠다.

  • 첫 대회에서는 베이스라인 코드 이해와 제대로된 깃 사용을 목표로 했던 것 같다. Dataset, Dataloader, Model이 어떤식으로 동작하는지, 자연어 데이터는 어떤식으로 분석해야 하는지, label imbalance가 심할 때는 어떻게 학습을 다뤄야하는지 등을 주로 신경썼다.

  • 사실 첫 대회는 대회 기간 내에서보다 마지막 마스터 클래스에서 다른 팀원들의 발표, 그리고 그 발표에 대한 김성현 마스터님의 피드백이 엄청난 도움이 됐다. 팀이 바뀌고 진행한 첫 대회라서 그랬는지는 몰라도, 우리 팀이 뭔가 제대로 '실험'을 하고 있다는 느낌이 조금 부족하다고 느꼈다. 그게 "안 되는 것이 왜 안되는가"에 대한 집중이 없었기 때문이었다는 것을 마스터 클래스에서 정말 뼈저리게 느꼈다.

  • 시도 이후 실패로 결론이 났을 때, 나는 보통 체계적인 탐구나 계획 없이 생각나는 대로 수정안을 또 실험하고, 안되면 또 조금 수정해서 시도하고 했던 것 같다. '왜 안되는지'에 대해 깊게 생각하지 않으면 제대로 된 트러블슈팅은 거의 불가능하다. 그래도 명색이 석사인데 실험자의 기본도 못 갖췄다는 것이 수치스러워서, 종료 이후 주말에 또 잠을 설쳤다.

[Lv.2] 두 번째 대회

  • 다시는 같은 실수를 반복하지 않으리 굳게 다짐하고 두 번째 대회의 시작을 맞이했다. 그런데 이게 웬걸, 이번엔 내가 아니라 대회가 큰 실수를 저질렀다. 그간의 대회와는 다르게 첫 날부터 많은 수의 문의가 빗발쳤으며, 확실하게 대답해주는 일이 드물었다. 그것이 3일, 4일 쌓이고 나서야 제대로 된 재검토에 들어갔는지, 결국 1주차 금요일 대회는 중단됐다.

  • 대회는 토요일 밤에 재개됐다. 베이스라인 코드부터 데이터셋까지 모든 것이 갈아 엎어졌다. 정상화가 된 것은 다행이지만, 하필이면 내가 1주 동안 했던 모든 작업이, 정말 말 그대로 모든 코드가 무용지물이 됐다. 멘탈이 가루가 되기 직전이었다. 절치부심하고 실수를 반복하지 않겠다고 다짐하고 낮이고 밤이고 쏟아부어서 임했는데, 이게 인생인가 싶었다.

  • 하루를 넋이 나간 채로 보내고, "어쩌면 애매하게 날아가는 것보다 그냥 생으로 다 날아간 게 다행이지 않을까?"와 같은 정신 나간 체념 및 자기 세뇌와 함께 2주차를 맞았다. 생각보다 회복은 빨랐다. 아예 뇌와 마음을 비우니 새로이 적용할만한 방법들이 떠올랐다.

  • 데이터 노이즈를 지우기 위해 다른 LLM을 denoising 모델로 활용하는 법이나, 모델의 logit 값을 이용하는 방법들을 공부하고 사용해봤다. 이때 아마 내가 시도했던 방법이 가장 높은 성능 향상을 기록했던 대회였던 것 같다. 세상이 나를 억까할 때 그걸 이겨내는 카타르시스는 생각보다 대단했다.

[Lv.2] 세 번째 대회

  • 다사다난한 경험을 하고 Lv.2의 마지막 세 번째 대회로 접어들게 된다. 부캠 커리큘럼 내 마지막 대회라서인지, 두 번째 대회를 할 때 쯤부터 마지막 대회의 난이도가 꽤 높다고 소문이 났던 것이 정말이었다. 자세히 말할 수는 없지만, 그간의 task와는 달리 단순히 메인 모델을 학습시키는 것 뿐 아니라 이를 보조하는 또다른 서브 메커니즘이 있었다.

  • 이 때문에 베이스라인 코드는 전례없이 복잡했다. transformers 모듈들을 task에 맞게 커스텀한 여러 함수들이 있었는데, 전처리 - 학습 - 후처리가 모두 연결되어 있어 실험을 위해서는 조금 더 low-level의 컨트롤이 필요했다. 당연히도 엄청난 양의 에러 메세지와 마주해야 했다.

  • 해당 코드가 그간의 대회 코드와 달리 DatasetDict(arrow) 형태의 파일을 직접 받았기 때문에, 먼저 데이터 핸들링의 편의를 위해 CSV로 입출력을 바꾸고 추가로 config를 YAML로 처리하는 작업을 먼저 진행했다. 지금 생각해보면 참 별거 아니었다 싶지만, 당시에는 프로젝트 구조도 100% 이해하지 못한 채 맨땅에 헤딩 식으로 부딫혀서 이 작업에만 거의 3일을 썼다.

  • 리팩토링(?)과 몇 가지 간단한 실험을 마치고 보니, 코드에 대한 이해도는 꽤 많이 높아져 있었다. 이후로 어떤 실험을 할까 고민을 했었는데, 어차피 마지막 대회이니만큼 조금 삐딱선을 타보기로 했다. 보통 조교님들이나 멘토님들이 대회에 팁을 주게 되는데, 거기서 성능이 보장되지 않는다고 말한 방법들을 여러가지 시도해보았다.

  • "남들이 안하는 데에는 이유가 있겠지" 할 때 그 '이유'가 궁금했다. 이 과정에서 GPT나 T5 계열의 생성 모델들도 건드려보고(기존 방식은 BERT 계열), 주로 서브 모델에 적용하는 방법론을 메인 모델에도 적용해보고 하면서 일부러 reference가 적은 방법론들을 시도해보았다. 이때 Domain-adaptive pretraining(DAPT)도 경험해봤는데, 이 방법이 내 삐딱선들 중 유일하게 효과가 있었다. 알고보니 이 방법은 문헌이 엄청 많았더라...

  • 사실 이 세 번째 대회를 마쳐갈 때 쯤 나를 비롯해 팀원들은 체력적으로 고갈되어 있었다. 우리 팀은 대회 기간에 주 1회 오프라인 미팅을 가지면서 저녁 식사를 했는데, 마지막 주에 닭갈비집에서 정말 아무 말도 없이 닭갈비와 막국수를 흡입했던 기억이 난다.

Lv.3

[Lv.3] 새로고침데이

  • 단비와 같은 휴식이 있었다. Lv.3 기간의 최종 프로젝트 준비 겸 휴식을 위해, Lv.2 종료 이후 1주일 간의 방학이 주어졌다. 미뤄왔던 젤다도 좀 하고, 연구실이랑 작업하던 논문 디펜스도 마무리하고, 호캉스도 보내면서 정말 미친듯이 쉬기만했던 것 같다.

  • 사실 새로고침데이 직전에는 최종 프로젝트 대비를 위한 계획이 이것저것 있었다. STT 활용 방안도 조사를 좀 하고, FastAPI 강의도 좀 듣고, 서비스 개발 기초도 좀 익혀두고 싶었는데, 모두 3시간이 넘어가고 포기했다. 사실 이때 정신 나가서 그걸 다 병행했다면, 아마 최종 프로젝트 기간에 번아웃이 한 번 씨게 왔을 것 같다. 쉴 땐 역시 쉬어야한다.

[Lv.3] 최종 프로젝트 - Lec & Rec

  • 그동안 십수번의 논의를 거쳐 아이데이션한 최종 프로젝트 주제는 "강의음성 기반 속기/요약/퀴즈 제공 학습지원 서비스"로 결정되었다. 세부적인 동작 방식 등에 대해서도 고민이 많았는데, 여러 멘토 분들과 운영진 분들이 많이 도움을 주셨었다. 정말 감사하다고 느꼈다.

  • 초반에는 강의를 먼저 듣고, 모델링 작업을 먼저 진행했다. STT는 추론 시간 상 도저히 hosted로는 서비스할 수가 없어 API를 호출하는 방식으로 진행했고, 이에 음성 청킹 + 멀티스레드 방식을 적용해 속도를 향상시켰다. 나머지 요약 및 퀴즈 생성의 경우 직접 모델링에 들어갔다. 나는 처음에 STT API 호출 작업을 맡고, 빠르게 마무리한 이후 퀴즈 생성 모델 쪽으로 넘어가는 역할이었다. 둘 다 어렵지 않게 작업할 수 있었다.

  • 문제는 서비스 개발이었다. 그 쪽으로는 한 번도 제대로 된 경험을 해본 적이 없었고, RESTful API가 뭔지, 백엔드가 어떤식으로 동작하는지, 프론트엔드와는 어떤 식으로 소통하는지 전혀 알 턱이 없었다. 그 와중에 모델링 전반의 작업을 맡았던 내가 모델과 DB의 연동을 맡게 되었고, 한 4일 정도를 내리 고생만 했던 것 같다.

  • 여지껏 대회를 진행하면서 무언가 시도하는 것이 어려웠을 때, 시도에 실패했을 때는 느껴보지 못했던 압박감과 좌절감을 느꼈다. 그 기간 동안 팀원들에게 미안해서 말도 먼저 잘 안 꺼냈던 것 같다. 그러나 늘 그랬듯이, 부딫히면 배우고 배우면 성장한다. 매달린지 4일 째 낮에 FastAPI의 BackgroundTasks와 asyncio 비동기 처리를 이용해 모델 연쇄 추론 중간중간 실시간 DB 업데이트를 성공시켰다.

  • 이 작업을 성공시키고 혈이 뚫리니 프로젝트 전반을 보고싶어졌다. 내가 만들어놓은 백엔드가 어떻게 프론트엔드와 연결되는지, 추가로 필요한 작업이 있다면 어떤 것인지 등을 팀원들에게 물어물어 찾아갔다. 이후로는 추론 결과 PDF 내보내기와 요약 모델 성능 개선 작업에 몰두해서 두 작업 다 잘 마무리지었다.

  • 마지막으로는, 이제 정말 내가 잘 하는 것을 할 수 있다 생각해서 발표자 역할에 자원했다. 그래도 PPT만큼은 연구실 생활하면서 수도 없이 만들어 봤으니 자신은 있었다. 최대한 흐름대로 내용을 요약해서 시각자료들과 함께 채워나갔고, 마감 전 날 발표 영상까지 잘 촬영해서 제출했다.

  • 얼마 전 네트워킹 데이에서 다른 팀들의 프로젝트 영상을 봤을 때에도, 이전 마스터 클래스 때 느꼈던 것과 같은 부러움과 후회가 조금은 밀려왔다. "왜 이 툴을 사용하지 않았을까", "조금 더 핫한 모델을 사용해볼걸", "발표를 이렇게 구성하면 정말 깔끔하고 보기 좋았을걸" 등등.

  • 다만 진심으로 이전만큼의 후회를 느끼고 있냐하면 그건 아니다. 우리 조의 주제가 실용성으로는 가장 좋았다고 느끼며, 3개 모델의 연쇄 추론 또한 쉬운 작업이 아니었다. 가장 중요하게는 완성된 결과물의 기능이 초기의 기획 단계보다 추가됐으면 추가됐지, 부족한 점은 조금도 없었다. 진심으로 만족할만큼 많은 것을 시도했다. 물론 클라우드나 CI/CD 등을 제대로 사용해보지 못한 것은 여전히 아쉬우나, 무리하지 않았기 때문에 좋은 결과가 있었다고 합리화할 수 있을 것 같다.

수료

  • 회고를 쓰는 지금으로부터 딱 3일 전에, 인생에서 가장 빠르게 지나갔던 다섯 달의 몰입 기간이 끝났다. 수료식마저 온라인인 21세기 최첨단 교육이라 다소 아쉬웠지만, 그래도 이 기간을 내 스스로 알차게 보기도 했고, 좋은 사람들을 많이 만난 것 같아 나름의 감동이 있었다.

  • 5달 전의 나는 'AI 엔지니어 지망생 지망생'이었고, 지금에 와서야 비로소 'AI 엔지니어 지망생'이 된 것 같다. 아직 현업에서 일하기 위해서는 공부해야할 것도 산더미고, 이력서에 추가해야할 내용도 많아 보인다. 하지만 부캠 기간을 나름 성공적으로 보냈다고 생각하니, 그간 뼈에 새겨진 것 같았던 조급함도 어느정도는 덜어냈고 자신감도 생겼다.

  • 확실하게 이제는 진로를 바꾼 것에 대해, 6년이 넘는 시간을 보냈던 내 원래 전공을 떠나온 것에 대해 조금도 후회하지 않는다. 정말로 이제 현대인이 일생에 가장 자존감이 떨어져있다는 무직백수 취준생이 되었지만, 언젠가 이 길을 직업으로 삼을 수 있다는 생각에 설레기도 한다. 태생이 ENTP라 그런지 역시 하고 싶은 일 하며 살 팔자가 맞나 싶기도 하다.

  • 이제 끝인게 아니라 지금부터 진짜 고생길이 열리겠지만, 부캠에서 얻은 것들로부터 뿌리를 내려 잘 버텨보리라 다짐할 수 있을 것 같다. 언젠가 취업을 하게 된다면 취준 기간의 회고도 적어볼 예정이다. 내가 만난 부캠 사람들 모두 잘 버텨내고, 나중에 동창회(?)도 가져보면 어떨까 싶다.

2023.08.05(토) 21:25 회고 마침

profile
J의 틀에 몸을 녹여 맞추는 P

1개의 댓글

comment-user-thumbnail
2023년 8월 5일

글 잘 봤습니다.

답글 달기