지난 주 금요일, 부트캠프에서 진행한 3번째 팀 프로젝트 MLOps 프로젝트가 끝났습니다! (얏호!)
그래서 이번 편은 MLOps 프로젝트가 어떻게 진행됐는지 그리고 후기를 풀어볼까 합니다. 끝난 지 얼마되지 않은 따끈따끈한 팀플 후기입니다.
여러분은 MLOps라는 단어를 들어보셨나요? 저는 이번에 프로젝트를 시작하면서 처음 들어봤습니다. 다른 기수에서는 하지 않았던 수업과 프로젝트이고, 오직 4기(!)에서 최초로 시작했다고 하는데요. 다음 기수도 이걸 할 수 있을지는 모르겠군요. 저희의 평가에 따라서 달라지겠죠? 어쩌면 흔치 않은 수업이였고, 프로젝트라서 더욱 남길 가치가 있는 것 같습니다.
인공지능이 핫하게 떠오른 지가 얼마되지 않은만큼, MLOps라는 분야도 막 태어나 커져가는 신생 분야라고 할 수 있는데요. 머신러닝으로 모델을 개발하면 이걸 배포하고, 모델의 성능이 떨어지지 않도록 꾸준히 유지보수하는 것을 말합니다. 자동화를 시킬 수도 있고, 또 사람이 직접 하나하나 관리할 수도 있죠. 그리고 모델을 많은 사람들이 사용할 수 있도록 프론트나 백에서 모델이 잘 돌아갈 수 있도록 해줘야하고요. 그래서 제가 느끼기에 굉장히 개발자 포지션에 가까운 영역이였어요.
김인섭 강사님께서 먼저 수업을 진행해주셨어요. 주로 배웠던 것은 MLflow로 모델 버전 관리하는 것, FastAPI로 웹서버와 연결시켜 모델을 사용할 수 있게 하는 것, Airflow로 전체 주기를 자동화하는 것이었고, 도커나 AWS s3 도 살짝 들어갔는데 솔직히 이부분은 따라가기 힘들었어요. 오류가 너무 많이 나더라고요. 수업은 4일 정도 했고, 이후에 바로 프로젝트를 시작했습니다.
주제는 영화 리뷰 감성 분석 모델 배포와 영화 추천 시스템, 또는 자유주제 중에서 선택할 수 있었는데요. 저희 조는 mnist 데이터셋을 활용해 숫자를 인식하는 모델을 만들고, 사용자가 손으로 숫자를 쓰면 이 숫자를 인식해서 음성으로 내뱉어주는 서비스를 만들고자 했어요. 솔직히 말하면 모델 학습을 위해 데이터셋을 새롭게 구할 필요가 없다는 점이 컸습니다. ㅋㅋㅋㅋㅋ
그러니까 정리하면,
1. mnist 데이터셋을 학습시킨 모델을 만든다.
2. FastAPI로 사용자에게 숫자를 입력받을 페이지를 만든다.
3. 사용자가 숫자를 입력하면, 모델이 그 숫자를 인식해서 정답을 내놓는다.
4. 이렇게 사용자가 입력한 숫자와 정답은 데이터베이스에 저장하고, 데이터가 쌓이면 일정 주기로 모델이 재학습한다.
5. 재학습한 결과 모델의 성능이 더 좋다면 모델을 저장하여 업데이트한다. (FastAPI가 정답을 맞출 때 쓰는 모델이 업데이트되는 것)
6. 이 과정은 Airflow로 전체 파이프라인을 구성하고, 모델 관리는 MLflow로 한다.
자, 프로젝트는 어떻게 진행됐을까요?
2024년 9월 26일, 팀이 정해지고 첫 회의를 했습니다. 목요일이였고, 그 다음 주가 퐁당퐁당 공휴일이 있는데다가 다들 개인적인 휴가 사용으로 빠지는 사람이 많았어요. 그리고 다들 수업을 제대로 듣지 못해 mlflow와 airflow, 도커 등에 대해 좀 더 공부를 하고 프로젝트를 진행하고 싶다고 의견이 모아졌습니다. 그래서 저희는 10월 2일 수요일까지 각자 공부를 끝내고, 이후에 본격적으로 개발을 시작하기로 했습니다. 공부를 대략적으로 마치고, 10월 2일에 주제도 정하고 각자 역할도 분담했습니다. 제가 맡은 부분은 airflow였어요.
그리고 10월 7일 모델 개발 부분을 맡은 팀원분께서 mnist 데이터셋으로 모델을 완성하고 코드를 공유해줬습니다. 또 다른 팀원분께서는 FastAPI로 숫자 데이터를 받을 부분을 만들어주셨고요. 처음에는 왼쪽처럼 간단한 모습이였는데, 나중에는 직접 마우스로 숫자를 바로 그릴 수 있도록 업그레이드 됐어요!
그런데 문제가 있었으니, mnist데이터셋으로 학습을 하고 그 데이터로 검증했을 때에는 정확도가 꽤 높았거든요? 98~99%에 달할 정도로, 높은 정확도가 나왔어요. 하지만 직접 손으로 숫자를 써서 올리면 제대로 인식을 못하더라고요ㅠㅠ mnist 데이터와 사용자가 넣는 데이터가 다르기 때문에 그런 것 같았어요. (최대한 전처리로 비슷하게 맞춰주려고 했으나..) 아마 데이터셋이 훨씬 더 많이 쌓이고, 사용자가 넣는 데이터가 많아지면 많아질수록 정확도가 올라가지 않을까 싶어요.
그리고 다른 분께서 모델 학습에 mlflow를 적용해주는 부분을 작성해주셨고, 저와 또 다른 팀원분이 함께 Airflow로 전체 파이프라인을 만들려고 했는데...! 하하 어렵더라고요 ^^ (코딩 시작한지 3개월도 안됐다는 점 참고...)
Airflow로 만들고자 했던 Dag는 이렇습니다.
이미지 감지 >> 새로운 손글씨 이미지 전처리 >> 모델에 넣어 재학습 >> 기존 모델과 성능 비교 후 저장
손글씨 데이터는 이미지로 폴더에 저장이 됐어요. 그래서 폴더에 이미지 파일이 있는지 먼저 감지를 하게 했고요. 새로운 손글씨 이미지는 mnist 데이터셋과 최대한 비슷하게 전처리를 해줍니다. 그래야 모델이 조금이라도 잘 학습할 것 같아서요. 그리고 모델에 넣어 재학습을 시키고, 기존 모델과 성능을 비교하여 저장하면 끝입니다.
Dag를 구성하고 실행시켰는데, 그냥 폴더에 파일만 있으면 넘어갈 수 있는 new_data_sensor부터 막히더라고요. 아, 생각해보니 이 창 자체를 띄우는 것부터 막혔습니다. 에어플로우 서버를 실행시키는 곳과 스케줄을 띄우는 곳의 위치(?)가 같아야 뜨더라고요. 환경변수로 똑같이 지정해줘야 했는데, 강사님께 여쭤보지 않았다면 계속 헛짓거리만 하다가 에어플로우 띄워보지도 못하고 끝날 뻔 했어요.
대그가 나타난 것까지는 좋았는데, 작업 실행 하나하나 넘어가는 게 왜 이리 어려웠던 건지. 처음이니까 당연한거겠죠? 맞아요, 징징거리는 거 그만하고 일단 뭘 알게 됐고, 어디까지 할 수 있었는지 설명드릴께요.
일단 저는 이미 모델이 구현됐고, 파일도 기존에 전처리하는 함수라던가 모델 학습하는 함수도 모두 만들어져있으니까, 그냥 에어플로우에서는 아까 썼던 함수를 복붙하기만 하면 된다고 생각했어요. (착각이였죠!) 좀 더 생각해보니 그렇더라고요. FastAPI에서 숫자를 받아서 전처리를 하고 모델에 넣을 때에는 캔버스 위에 마우스로 그린 데이터를 바로 가져가서 하는 건데, 저는 폴더에 저장된 이미지를 전처리하려고 하니 이미지 인코딩이 달랐어요. 그래서 전처리 함수를 하나 더 만들어줘야 했고, 그마저도 뭐가 안맞는다나? Json파일로 바꿔달라고 합니다요..
이런 저런 고난이 있은 후, 모델에 집어넣는 건 그냥 하면 될 줄 알았는데요. 좀비가 나타납니다.
(이러지마...)
이 좀비잡은 뭘 해도 없어지지 않는 굉장히 끈질긴 좀비였습니다... 프로젝트 마감일은 11일 금요일이였는데, 좀비가 나타난 건 10일 밤. 그리고 결국 해결하지 못한 채로 프로젝트를 제출해야 했습니다. (원인이 아주 다양하다고 하는데, 원인을 찾지 못했어요..)
아쉽게도 일단은 마무리해서 제출은 했지만, 앞으로 좀 더 꼼꼼히 살펴보면서 해결방법을 찾아보려고 합니다. 그리고 팀플의 위력인데, 다른 분들의 코드를 보면서 이걸로 파이프라인 설계를 하려니 정말 다른 사람의 코드를 보고 이해한다는 게 또 얼마나 쉽지 않은 일인가를 깨닫게 되기도 했습니다. 아마 다른 분들도 그렇겠죠?
제가 맡은 부분이 완성되지 못해 아쉬움이 많이 남았어요. 하지만 최선을 다했기 때문에, 오류 하나 하나를 해결해나가면서 뿌듯함도 많이 느꼈던 것 같습니다. 그리고 전체적으로 다같이 이 과정을 알고 있었다면, 이전에 개발하는 사람이 뭘 참고하고, 다음 파트를 맡은 사람은 뭘 참고하면 좋을지 서로 공유하고 좀 더 매끄럽게 만들 수 있었을 것 같아요. 하지만 우리 모두 이런 프로젝트는 처음이였기 때문에.. ㅋㅋㅋ 귀하고 좋은 경험했다는 생각이 듭니다.
프로젝트를 할 때는 특히나 그런 것 같아요. 당장 해결해야 하는 문제가 있기 때문에, 정리를 제대로 못하게 돼요. 다음 주부터는 다시 강의를 듣는 시간이 있어서, 프로젝트 회고와 프로젝트를 좀 더 보충해서 제가 혼자서 더 실험해본 것들을 다시 기록해볼꺼에요. 정신없이 지나가는 요즘이지만, 그럴 때일수록 틈틈히 하는 기록이 나중에 큰 힘을 발휘할 것이라 믿습니다. 공부하시는 모든 분들 화이팅!
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
학습일지 | 딥러닝과 파이토치 (7) | 2024.10.21 |
---|---|
Airflow | 시작하기, 환경변수가 제대로 설정돼야 돌아감 (0) | 2024.10.14 |
판다스 | 조건에 따라 데이터 삭제, 중복 데이터 삭제 (1) | 2024.10.02 |
판다스 | 결측치 제거팁 (1) | 2024.10.02 |
아파트실거래가 예측 코드에 MLflow 덧붙이기 (3) | 2024.10.01 |