MAICON 후기

MAICON 후기

2022년 9월 30일부터 시작하여, 11월 8일부터 11월 14일까지의 MAICON 예선을 참여한 후기를 적었다. 필자와 같은 부대에서 참여한 총 4명의 팀원들은 모두 AI 프로젝트 경험이 사실상 없는 초보였으며, 전원 코딩테스트 통과 이후 예선전에서 25위 / 35팀 을 하여 여정을 마쳤다.

참여 과정

MAICON(Military AI CompetitiON)은 군 장병들을 대상으로 한 AI/SW 강의(Elice) 사이트에 올라온 공지사항에서 처음 발견하였다. 일정은 아래와 같았다.

  • 2022.09.30(금) ~ 10.14(금) : 참가 신청 및 코딩테스트 진행
  • 2022.11.08(화) ~ 11.14(월) : 온라인 예선
  • 2022.11.30(수) ~ 12.01(목) : 오프라인 본선

필자는 7월 경 AI에 입문하여 CS231n 강의 시청과 Assignment를 한창 달려오던 중 번아웃이 온 시기였다. 눈 앞에 보이지 않는 보상은 역시나 정신적 동기부여를 흐릿하게 만들었고, 나 혼자 잠을 줄여가며 하는 공부에 회의감이 몰려 오던 찰나였다. AI 경진대회 참여는 확실한 동기부여이자, 보상이자, 성장의 지름길이라고 판단했다.

예선 부터는 반드시 4인 1팀으로 참여해야 했고, 같은 부대의 아는 사람들끼리 하는 것이 편할 것 같아 동기 두 명과 후임 한 명을 데려와 팀을 만들었다. 목표는 예선에서 10팀 안에 들어 본선 진출.

코딩테스트

군 장병 부문은 전체를 대상으로 알고리즘 코딩 테스트를 진행하였다. 참가자들에게는 A, B, C 의 세 가지 유형이 랜덤하게 주어졌고, programmers에서 2시간 / 3문항 (300점 만점)이었다.

코딩 테스트 초대장

500명 정도 신청한 대회에서 총 140명(35팀)이 코딩테스트를 통해 선발되었다. 사실 말이 많이 나온 테스트였지만, 여기서는 생략하도록 하겠다. 개인적으로는 Python 3 만을 사용하게 한 점과, AI 경진대회의 참여 조건으로 알고리즘 테스트를 보는 이유가 이해되지 않았다.

그래도 덕분에 C++ 로만 해본 알고리즘 공부를 Python으로 하는 경험이 되었다. 일주일 남짓의 시간 동안 Programmers에서 제공하는 코딩테스트 고득점 Kit를 Python 으로 풀었는데, 생각보다 많은 도움을 주었다. 처음 알고리즘을 입문하는 사람 말고, 필자처럼 1~2년 동안 손 놓았던 알고리즘 코테를 갑자기 맞닥드렸을 때 감 잡는 용도로 활용하면 좋을 것 같다.

필자는 180점 / 300점 을 받았는데, 합격 커트가 118점, 합격자 평균이 200점인 것은 꽤나 놀라웠다. 군인을 대상으로 한 타 대회에 비해 합격 커트와 평균이 상당히 높았기 때문이다. 장병 뿐 아니라 공무원, 간부들도 포함되서 그런가 싶었다. (실제로 합격자 중에 중령 분도 계셨다) 다음에 진행되는 MAICON을 준비하는 사람들은, 이 코딩테스트 ‘생각보다 잘’ 대비해야 한다고 말해주고 싶다.

합격 통보

필자는 사전에 꾸린 팀원 4인이 모두 코딩 테스트를 통과하여, 별도의 팀빌딩이 필요하지 않았다.

예선

예선 정보

예선은 다음의 사이트 에서 진행되었다. 정보는 아래와 같았다.

  • 주제: 항공 이미지 데이터를 활용한 건물 변화 탐지 (군 정찰 자산 활용성 극대화를 위한 AI Computer Vision)
  • 문제 정의: 전후 이미지를 비교하여 건물 변화를 탐지 및 분할하는 문제
  • 제출 횟수: 결과 제출 제한 - 1시간 1회 제출
  • 제출 용량: 최대 50MB
  • 활용 가능 데이터: 주최 측에서 제공한 학습 데이터 외의 외부 데이터 활용 금지, 테스트 데이터는 학습에 사용할 수 없음 (Pseudo labeling 금지)
  • 사용 가능 Pre-trained model: 법적 제약이 없고 대회 공고일(2022년 9월 30일) 전까지 공개된 Pre-trained model 사용 가능
  • 평가 지표: mIoU (mean Intersection over Union), keras.metrics.MeanIoU와 동일 로직

예선전 진행

결과론적으로, 부대로부터 정말 전폭적인 지지를 받았다. 부대가 AI 교육 시범 부대로 선정되어 AI 교육을 위한 교육장까지 지어지고 있었을 정도로 대대장님, 단장님, 사령관님께서 긍정적인 관심을 가진 덕분이었던 것 같다. 도움을 받기 위해 처음이자 마지막 마음의 편지를 작성했었는데, 생각 이상으로 여건을 많이 보장 받았다. 예선전 기간과 그 전 주의 2주 정도를 대부분의 일과를 빠지고 싸지방에서 AI 공부 및 대회 참여를 하였다. 또한, 잠실의 KT 지사에 방문하여 멘토링 Meeting을 통해 도움을 받을 수 있었다. 사람이 적고 작업과 훈련이 많아 휴가 측면에서도 굉장히 엄격했던 부대라 상상도 못한 여건 보장이었다. 육군 출신이면 이게 얼마나 말이 안 되는 상황인지 알 것이다. 열심히 살아가는 사람들에게 세상이 아직 따뜻하다는 생각을 했다.

예선전 전부터 주제가 미리 공지되었던 터라 Computer Vision, 그 중에서도 Image Segmentation을 공부하였다. 기초 논문들부터 SOTA 까지 공부했고, 개인적으로 Colab과 Kaggle을 이용하여 Pytorch, Wandb와 같은 실전 툴들을 익혔다. 필자는 특히 CS231n으로 AI 입문을 하던 터라 기초 수학적 이론은 정립되어 있었지만 Pytorch를 다룰 줄 몰랐기에 이에 더 집중했다.

하지만 프로젝트 경험이 없는, 특히나 AI 경진대회 경험이 한 명도 없는 팀은 너무나 많은 시행착오를 겪어야만 했으며, 빅데이터의 세계에서 시행착오 한 번은 너무나 큰 리스크였다. 모델 학습을 돌려 놓고 자고 눈 뜨자마자 뛰어 찾아간 싸지방 모니터에 CUDA memory error로 저장도 못 하고 터져있는 모델을 마주했을 때는 울고 싶었다. 유의미한 학습에 최소 10시간은 필요한 상황에서, 학습 결과의 초반을 보고 뚝심 있게 기다리는게 맞을지 보완을 해서 바꿔 돌려야 하는지의 판단도 서툴렀다. 팀 프로젝트에서 효율적인 협업, 전략, 역할 분배, GPU 관리 등 많은 것이 부족했다.

프로젝트

전체적으로 likyoo의 change_detection.pytorch을 import 하여 사용하였다. 이 library는 ‘Change Detection of remote sensing images’를 위해 만들어진 library로, 다양한 util function 들과 model, encoder를 지원해 주어 사용하였다. 대회 당시에는 본 library를 fork 하여 조금 수정하여 사용하였다.

주어진 문제의 가장 특이했던 점은 Multiclass Change Detection 이라는 점이었다. 기존의 대부분 Change Detection (이하 CD) 문제들은 바뀐 영역은 1 (흰색), 그렇지 않은 영역은 0 (검은색)으로 표현하는 것이 대부분이었다. 예선전 전까지는 당연히 이를 대비하여 공부하였다.

Binary Classification CD: 차례대로 전, 후, 정답 mask, 출력한 mask를 의미한다

그러나 본 Task에서는 다음과 같은 multiclass classification을 요구하였다.

  • Background(Pixel Value 0): 신축, 소멸, 갱신 중 어느 것에도 해당되지 않음
  • 신축(Pixel Value 1): 왼쪽 대비 오른쪽 사진에 건물이 생성된 경우
  • 소멸(Pixel Value 2): 왼쪽 대비 오른쪽 사진에서 건물이 붕괴되어 없는 경우
  • 갱신(Pixel Value 3): 양쪽 같은 위치에 건물이 있으면서 한쪽에 변화가 있는 경우

Multiclass CD: 차례대로 전, 후, 정답 mask, 출력한 mask를 의미한다

Multiclass가 추가되니 굉장히 많은 Idea들이 적용될 수 있었다. 우리 팀은 다음의 idea들을 시도해 보았다.

  • 주어진 Dataset의 사진은 전후 사진이 분리되어 있지 않고 직사각형 모양으로 주어졌는데, 직사각형 사진을 통째로 이용하는 방법과 이를 절반으로 나누어 각각 이용하는 방법
  • Multi-classification을 하지 않고 Mask를 픽셀별로 One-Hot Encoding 하여, 각각에 대한 Binary Classification을 한 뒤 결과를 모두 합치는 방법
  • 주어진 Image를 2 x 2의 4개 Image로 잘라 input으로 사용하는 방법. 이 때 mask 픽셀이 없는, 즉 변화가 없는 data는 모두 소거하였다. 작은 변화 탐지와, Dataset 개수 증가에 따른 성능 향상을 기대하며 시도.
  • 다양한 Model(Unet, Unet++, STANet)과 Encoder(noisy-student + efficientnet-b?, regnety, Swin-T, etc.)
  • 다양한 Albumentations (Cropping, Gaussian Blur, etc.) 적용
  • 다양한 Loss (Jaccard Loss, Dice Loss, Hybrid Loss = Jaccard Loss + Dice Loss, Cross Entropy Loss, etc.) 사용
  • 다양한 Learning Rate (1e-3, 1e-4, 1e-5, etc.) 사용
  • 다양한 Learning Rate Scheduler (CosineAnnealing LR, Step LR) 사용
  • 다양한 크기의 Batch 사용
  • Shadow Remover 와 같은 외부 library를 이용한 data preprocessing

예선전 기간 동안 명확히 확인할 수 있었던 중요한 factor는 model 및 encoder, loss, learning rate, batch 정도였다. Model 및 encoder, learning rate의 영향을 받는 것은 당연했다. 여기에 덧붙여 Loss 종류와 Batch의 크기에 따라 생각보다 많은 영향을 받았다. 다만 이 두 factor를 다루는 데에 있어서 지식이 많이 부족하고 미숙했다.

Loss의 경우에는 Binary Classification 에만 활용되고 Multiclass Classification에는 사용될 수 없는 Loss가 꽤 있었는데, 제대로 공부하지 않고 그냥 가져다 사용한 덕에 무의미한 학습으로 초반 시간을 날렸다.

Batch 크기의 경우 GPU 서버의 RAM Memory와 직결되는 factor인데, 특히 SOTA에 가깝거나 parameter가 많은 무거운 모델의 경우 batch size를 조금만 올려도 CUDA memory error를 마주했다. 대회 기간 내내 어쩔 수 없이 batch의 크기를 4와 같은 작은 숫자로 진행하였는데, 결과론적으로 몇 천 장이나 되었던 dataset을 작은 크기의 batch로 학습시키는 것은 성능도 아쉬웠고 시간도 너무 오래 걸렸다. 대회가 끝난 후, 같이 참여한 예선전에서 1등을 한 과 후배가 Auto Mixed Precision이라는 방법을 알려주었는데, 이를 사용했으면 성능이 많이 향상되었을 것 같다고 생각했다.

이외의 Idea들이 무의미했다는 것이 아니라, 대회 기간 내에 미처 확인을 하지 못했다. 필자는 Hyperparameter Tuning 쪽 보다는 문제 해결의 접근법 자체에 집중하여 One-Hot Encoding, 2 x 2 Split 등의 Idea를 제시하고 코드로 옮겨 시도했었는데 시간 상의 문제로 각 Idea에서 최적의 결과를 확인하지 못했다. 최종 제출한 Submission도 어떤 방법을 사용한 방법인지 사실 기억이 안 날 정도다. 그럼에도 다양한 Idea를 떠올리고 코드로 변환, 적용할 수 있었던 점에서 뿌듯함을 느꼈다.

대회 기간 동안 다양한 Notebook 형태의 코드들을 돌렸는데, 이 중 몇 개를 GitHub에 올려두었다. 팀원 김태한이 정리한 것을 Fork 하여 올린 repo이다. 허나 시간이 굉장히 촉박했던 해커톤 형태였던 만큼, 코드들이 굉장히 더럽고 오류 난 결과가 그대로 있는 코드이므로 정말 참고용으로만 봐주기 바란다. 촉박한 시간 안에도 침착하게 깔끔하고 re-usable한, 자동화된 코드를 짜내는 것이 코딩 실력 아닐까? 지금 봐도 변수명들이나, 코드 아키텍처 등 잔뜩 hardcoding된 코드를 보면 굉장히 부끄럽다. 살제로 대회가 끝나자마자 코드를 컴퓨터에서 다 지워버렸을 정도였다. 그래도 지금 보면, 이게 해커톤 코드의 매력인 것 같기도 하다.

예선전 최종 결과

느낀 점 정리 (프로젝트)

  • 생각보다 GPU 서버의 성능이 굉장히, 굉장히 중요했다. 왜 주변에서 고액의 서버를 지원 받았다고 그렇게 자랑하고, 서버 지원 여부에 따라 강의 평가가 그렇게 갈리는지 뼈저리게 깨달았다. 근데 그만큼 중요한 건 Memory 관리 능력이다. Auto Mixed Precision 과 같이 적은 RAM Memory 안에서 고효율의 작업을 하는 것이 매우 중요함을 깨달았다.
  • 받은 Dataset에 오류가 있는 Data도 꽤 있었다. 데이터 개수도 충분히 많았는데, 왜 얘네를 아예 빼고 학습시킬 생각을 못 했는지 모르겠다. 오류가 있는 Data를 걸러내는 작업은 필수적으로 선행해야 한다.
  • 위의 내용에 이어, Data를 전부 이용할 필요도 없다고 느꼈다. 학습에 더 도움이 되는 데이터만을 이용해서, 같은 시간 내 더 큰 batch size로 더 많은 epoch을 돌려 더 좋은 성능을 낸 경우를 보았다.

후기

엄청난 지지와 기대를 어깨에 짊어진 우리 팀원 모두는 부족한 이론 베이스를 어떻게든 극복하고자 정말 열심히 고군분투 했다. 나는 감히 ‘성인 되고 이보다 치열하고 집중했던 적이 없었다’는 표현을 여러 번 사용했는데, 지금 되돌아봐도 과장은 아니었다. 모두가 간절했고, 진심이었다. 그래서 많은 감정을 느꼈다.

필자는 이번 기억을 기억에 남는 첫 실패 라고 정리하였다. 팀원 한 명이 친구가 해외 IT 대기업 면접에서 실패 경험을 물었을 때, 제대로 답변하지 못했다고 했다. 사실 필자도 지금까지 실패 한 경험이 있나, 돌아봤을 때 딱히 떠오르지 않았다. 고등학교부터 대학교까지, 노력한 대가로는 모두 목표했었던 대로 훌륭한 결실을 맺었다.

이번 경험은 조금 달랐다. 예선 기간 내내 대회 말고 한 게 잠, 식사, 점호 뿐일 만큼 매달렸지만, 결과는 처참했다. 그러나 후회는 없다. 예선전이 끝난 날에는 ‘지금부터 일주일을 줬으면 순위권 안에 충분히 들어갔다’고 확신했다. 그만큼 예선전이 시작됐을 때 부족했고, 예선전 진행 동안 배운 점도 많았다.

MAICON 참여 여부를 고민하는 채로 이 글을 찾아온 사람이라면, 꼭 참가해라. 지원도 최대한 요구해서 많이 받아내라. 귀찮고 두려울수록 더욱 참여해라. 성공하는 사람은 하기 싫은 일을 남들보다 더 많이 한 사람이라고 필자는 생각한다. 변화와 성장은 언제나 사람의 한계점에서 유지할 때 일어난다는 말을 들었다. MAICON은 어찌 보면 스트레스와 부담의 연속이었지만, 내 군생활에서 잊을 수 없는 최고의 경험이었다.

한 달간 정말 고생한 우리 MaechuriAI 팀. 아쉽지만 치타는 웃다 죽었다. 수고 많았다 얘들아

Author

Yeonsang Shin

Posted on

2022-12-07

Updated on

2022-12-19

Licensed under

Comments