제품 관점에서 머신러닝 프로세스를 적용하는 방법에 대해 이해하기
서론
“머신러닝 파워드 애플리케이션” 도서 리뷰는 한빛미디어 <나는 리뷰어다> 3월 활동을 위해서 책을 제공받아 작성된 서평이다.
올해 2번째 한빛 미디어 도서 리뷰를 참여하게 되었다.
일전에 읽었던 “구글의 사례로 보는 SRE를 위한 시스템 설계와 구축” 책도 구글의 사례로 서비스 안정성이나 보안에 다루는 내용에 대해 읽어 보면서도 깊은 감명을 받았는데, 이번에 읽은 책은 내가 일하고 있는 포지션과 직접적으로 연관되어 있는 것이다보니, 더 꼼꼼히 정독을 하게 되었던 것 같다.
개발 책을 2번 이상 읽어야겠다고 생각했던 건, 조영현 개발자님이 출간한 “Node.js” 교과서 이후로 처음이다.
개인적으로 조금씩 현업 task를 받고 있는 상황이다보니, 와닿는 내용들이 몇 가지 있었는데, 이것들을 중심으로 도서리뷰를 해보고자 한다.
이 책을 읽는 것을 고민하는 사람은 다음 2가지 내용에 대해 생각해보고 구매하면 될 것 같다.
- 현재 모델 & 데이터셋에 대한 고급 지식을 얻는 것이 아니라 머신러닝 프로젝트 Lead를 어떻게 할 지 방향성을 고민하는 사람
- 데이터 수집부터 모델 배포까지 프로세스를 빠르게 확인하고 싶은 사람
2회독하면서 내용의 핵심 요약이 필요해보여, 이에 대한 사항은 별도의 노션 페이지에 정리해놓았으니, 참고하면 좋을 것이다.
본론
이번 책이 유독 감명 깊었던 것은 크게 3가지가 있었다.
- 제품 관점에서 머신러닝 프로젝트는 어떻게 기획할지
- 머신러닝 외적으로 파이프라인 등 제품 운영을 위한 설계에 대해 기획 단계에서 어떤 고민이 포함될 것인지
- 실제 현업 개발자와의 Q&A
2021년 파이콘에서 뤼이드 머신러닝 개발자가 연사로 참여한 발표에서 이런 얘기를 한 적이 있다.
“머신러닝은 소잡는 칼입니다. 비즈니스에서 큰 문제를 해결하기 위해 도입하는 기술이에요.”
이 말에서 많은 것들을 내포하고 있겠지만, 기본적으로 머신러닝 프로젝트를 도입하기 위해 사용하는 자원들이 일반적으로 소프트웨어 엔지니어링을 적용해서 문제를 해결할 때보다 많이 필요하기 때문에 “머신러닝은 소 잡는 칼”이라는 표현을 했던 것으로 나는 받아들였다.
“제품 관점에서 머신러닝 프로젝트는 개인 프로젝로는 어렵겠다…”
생각이 이렇게 박히고 나니, 머신러닝 개인 프로젝트로 좋은 아이디어들이 떠오르기 어려웠는데, 이 부분에 대해 이 도서도 수긍하지만, 우리가 “고객이 사용하는 제품”을 기획할 때, 너무 최신의 모델 / 기술을 개발 초기부터 적용하려고 하면, 인적 & 물적 자원을 많이 소모하게 되고, 최악의 경우 그렇게 투입한 자원의 결과물이 고객에게 외면 받을 수 있으므로 정말 간단한 모델로 팀에서 논의한 결과를 간단하게 동작할 수 있는 서비스 프로토 타입을 빌드해보라는 얘기를 하게 된다.
발상 자체가 굉장히 스타트업스럽고, 실제로 도서의 실습을 위해 제공하는 모델도 랜덤 포레스트를 사용할 정도로 최신 모델이나 트렌드에 기반한 내용은 거의 언급되지 않는다.
그래서 빌드한 첫번째 프로토타입은 UI도 없다. 터미널에서 입력값을 받아, 랜덤 포레스트로 문장에 대한 추천 유사도를 확률적으로 띄워주는, 그야말로 로직 정의 시, 누락되거나 수정되어야할 부분들을 찾는데 먼저 자원을 사용한다.
“머신러닝 외적으로 기획 단계에서 어떤 고민이 포함되어야할까?”
2번째 질문에서는 문장을 굉장히 추상화 시켰지만, 여기에 포함되어야하는 것들 중 일부를 언급해보자면
- 데이터 수집, 전처리
- 데이터 누수, 샘플 오염 관리
- 모델 구성, 성능 측정
등이 된다. 언급된 내용들이 전부 “머신러닝 내적”으로 고려가 되어야하는 사항이 아니냐고 반문할 수 있겠지만, 해당 주제들에 대해 외적으로 고민해야하는 사항들이 존재했다.
- 데이터 & 시스템 편향
- 피드백 루프, 모델 속이기
이전에 Coursera에서 제공하는 mlops 강의에서도 언급되지만, 일부 데이터들의 경우, 데이터가 특정한 편향을 띄고 있어, 모델이 이러한 편향을 그대로 학습하는 경우가 존재하며 (즉, 데이터를 수집하는 단계에서 편향에 대한 이해가 부족했거나, 누락되는 경우), 일부 집단을 부당하게 차별하게 만드는 제도나 구조적인 헛점이 포함될 수 있는 부분들이다.
그리고 소수의 사용자들의 피드백으로 인해 이 사용자 집단을 위한 편향이 생기는 경우도 발생하며, 사기꾼들이 자신들을 합법적 사용자로서 모델을 속여 부당한 이익을 얻는 경우도 발생한다.
이러한 부분들이 머신러닝 외적으로 기획을 하는 단계에서 함께 고려가 되어야하며, 운영하고자 하는 서비스에 대한 정확한 이해와 모델의 동작, 그리고 사용하고자 하는 데이터에 대해 제대로 바라보지 못하면, 머신러닝 프로젝트에 참여하고 있는 모두가 겪을 수 있는 문제라는 것을 암시한다.
“실제 현업 개발자와의 Q&A”
제일 많이 도움이 되는 부분이었고, 실제로 해외의 기업에서 근무하고 있는 ML 개발자들의 Q&A로 독자들이 놓칠 수 있는 부분들이 종종 언급된다.
나의 경우 후반부에 나오는 “크리스 할랜드”라는 사람이 서비스를 사용하는 고객들에게 예제로 사용되는 텍스트 에디터를 제공할 때, 사용자 가이드라인을 명확하게 제공하라는 부분이 조금 충격이었는데, 내가 자주 사용하는 영문법 교정 앱 중 “grammerly”라는 서비스를 사용하는 것과 같은 유사한 답변을 해주는 것 같았기 때문이다.
게다가 현업 개발자들의 Q&A에서 한결같이 공통적으로 언급하는 것은 “작은 데이터셋을 무시하지 말라”다. 옛날 모델을 사용하지 말라던가, 서비스 이용을 위해 경량화가 잘 되어 있는 모델들을 써라 등을 언급하지 않고, “데이터셋”에 대한 언급이 많았다.
머신러닝 서비스를 구성하는데 있어, 최적의 모델을 구성하는 것보다도 데이터셋을 잘 구성하는 것이 더 중요하다는 것을 다시 한 번 알게 된다.
최근에 팀원들하고 공휴일을 껴서 2박 3일 동안 1300편의 논문을 보면서 사내에 적용해 볼 수 있는 모델을 찾는 작업을 수행했다.
어떤 것이 사용될지는 모르지만, 이번에 책을 읽으면서 생각이 많이 들었던 것은, 데이터셋을 고품질로 관리하기 위해 어떤 생각과 방법을 적용할지, 그리고 데이터셋의 품질을 관리하는 논문이 있다면 이것들을 중심으로 읽어봐야하지 않을까하는 생각이 들었다.
Coursera 등에서 언급하는 데이터 전처리 방법이나 오류 관리 방법 등이 굉장히 기초적인 부분이라 생각했는데, 어찌보면 이 부분들이 정말 기본 중에 기본이고, 여기서 확장되는 개념들이 거의 대다수인 것 같아서, 이 책을 보면서 머신 러닝 분야가 워낙 발전이 빨라서, 언급되는 기본 개념들도 자리 못잡고 금새 새로운 내용들로 대체될 것이라 생각했는데, 리눅스가 여전히 컴퓨터 분야에서 기본기처럼 자리 잡은 것처럼 데이터를 보는 방법도 기본은 다르지 않을 것이라는 것들이 머리에 자리잡게 되었다.
결론
지금은 책의 내용만 읽은 상태고, 책에서 함께 언급되는 논문과 테스트 코드 등은 아직 적용을 못해 본 상태다.
책이 외국서적이라 텍스트 추천 모델 데이터셋도 영문을 가져와 사용한 상황이라 네이버 지식인 데이터셋 등을 이용해서 국문 버전으로 좋은 글 추천 에디터를 시험 삼아 구성해보고자 한다.
그리고 모델과 데이터셋 테스트 코드는 소프트웨어 엔지니어링과 조금 달라서, 한 번 직접 해보고 싶기 때문에 2회독을 하는 과정에서 프로토타입을 구성해서 테스트 코트 추가까지 해봐야겠다.
React.js (Client), Flask(Rest API), Model Serving (AWS Lambda나 GCP Vertex AI로 구성이 가능할 것 같다?) 형태로 모델 성능을 보고 구성해 보면 재밌을 것 같다.
한빛미디어 <나는 리뷰어다> 활동이 굉장히 만족스럽다. 이번 년도에는 꾸준히 도서 리뷰를 기록해야겠다.