Facilitate Your Life, FYLs
About me
Blog
Search
현재 오피스 책상, 하임캠프 25차 찬양팀 리더가 직접 작성해준 가사
개요
벌써 회고 날이다. 2022년은 코로나 팬데믹 이후로 드디어 외부 활동을 늘릴 수 있었던 시기였어서 정말 재미있던 일들이 많았던 것 같다. 개인적으로 만족하는 점들도 많았던 해이고, 아쉬웠던 점들도 좀 많았던 해였던 것 같다.
이번 회고도 올해 동안 어떤 일들을 진행했는지, 그리고 다른 일들은 어떤 게 있었는지 개인적으로 정리하는 목적으로 작성해보고, 내년에는 어떻게 살아갈지 간단하게 목표를 세워보려 한다.
What I did…
Working as a ML Engineer
벌써 가우디오랩에서 스캐터랩으로 넘어온 지도 1년이 조금 넘었다. 작년에는 온보딩과 함께 사내 ML 인프라 개선에 힘을 쏟았다면, 올해는 ML Pipelining 관련 일들을 많이 수행했었다. 많이들 이야기하는 “MLOps”를 제대로 해보고 싶다는 욕심이 컸던 것 같다. 1) ML Production Life cycle에서 구성원 간 커뮤니케이션 코스트를 줄이고, 2) 최대한 사람의 개입을 줄이면서 ML 모델이 학습되고 배포되기까지의 자동화를 하는 것에 대해 생각하는 게 재밌고, 사내 통합 ML 플랫폼을 구축하겠다는 미래를 보면서 달려왔기에 업무도 자연스럽게 그쪽으로 많이 진행했던 것 같다.
Apache Beam 도입, 그리고 비식별화 파이프라인
TFX의 Component간 상호작용, https://www.tensorflow.org/tfx/guide
사실 Apache Beam에 대해 원래 큰 관심은 없었는데, ML Pipelining 솔루션에서 나름 선두 주자를 달리고 있는 TFX(TensorFlow eXtended)에서 Apache Beam을 Backend로 하고 있기도 했고, 올해 초에 유닛 리드인 승환님이 Apache Beam에 대해서 이런저런 이야기를 해주셔서 관심을 가지게 되었다. 당시 Hadoop 기반의 데이터 파이프라인 솔루션들(MapReduce, Spark, Flink…)에 대해서도 사용해본 적이 없었고, 심지어 데이터 웨어하우스 솔루션들 (BigQuery, Redshift, ….)들도 사용해보지 못했을 정도로 데이터 엔지니어링에 대해선 완전 뉴비였었다.
그렇지만, Apache Beam을 공부하다 보니 정말 매력적인 Framework라는 것을 느낄 수 있었다. 처음 입문할 때는 “Write Once, Run Anywhere”라는 Apache Beam의 철학에 큰 매력을 느꼈다. Batch Pipeline과 Streaming Pipeline을 하나의 코드로 작성할 수 있다는 점은 둘째치고, 일단 동일한 코드를 Local 환경과 Container 환경, 그리고 GCP의 Serverless Apache Beam Runner 서비스인 Dataflow 환경에 바로 실행할 수 있다는 것이 너무 좋았다. 당시 사내의 ML 용 Data Pipeline들은 Kubeflow Pipelines로 작성이 되어있었는데, Kubeflow Pipelines는 실행 한번 해보려면 Docker Image들 말고, Pipeline 만들고, Kubeflow 배포하고, 거기에서 또 실행까지 하는 모든 과정이 너무 불편해서 Apache Beam의 장점이 더욱 도드라지게 느껴졌던 것 같다.
Apache Beam으로 수행한 주 업무는 사내의 Kubeflow 기반 비식별화 파이프라인을 Apache Beam으로 마이그레이션 하는 일이었다. 대화 데이터의 가명 처리는 일반적인 Tabular 데이터의 가명 처리와 달리 Regex 처리나 이름 치환 등 복잡한 로직들이 있고, 가명 처리의 논리를 지키기 위해 필요한 복잡한 처리 과정이 있었다. 그렇기에 Apache Beam 위에서 Faiss Vector Search를 진행한다든지, ML Model Inference를 수행하는 등 Apache Beam에 대해 ML Engineer의 입장에서 더욱 깊숙이 파헤쳐볼 수 있었다.
Retrospect 2022
2022/12/29 05:00
회고
스캐터랩 첫 출근날 사진
개요
2021년은 여러모로 심장 떨리는 일들도 많았고, 가장 변화가 많았던 해였던 것 같다.
오디오 기술로 사람들에게 훌륭한 ‘듣는 경험’을 전달하는 가우디오랩의 매력에 빠져서 첫 개발자로서의 생활을 가우디오랩에서 시작하기도 하였고,
얼마 가지 못해 6월에 병무청의 2022년 이후 현역에 대한 산업기능요원 편입 불가라는 공지를 보고서 6-7개월 만에 이직을 준비하게 되었다.
이후 성공적으로 스캐터랩에 이직하였고, 11월 정보처리산업기사 자격증을 취득하여 산업기능요원 편입에 성공하였다.
가우디오랩도 덕업일치가 정말 가능했던 회사라 너무 좋기도 하였고, 지금 다니는 스캐터랩도 가우디오랩에서 그토록 하고 싶었던 MLOps와 함께, 다른 ML 엔지니어와 협업할 수 있어서 나름 행복하게 회사에 다니고 있다.
ML Engineering으로의 입문, 그리고 MLOps 한 모금
그동안 유튜브로, 학교 동아리로, 연구실에서만 접하였던 ML을 실제로 Product에 적용해본 경험은 작년 소마에서 모바일 App Banju를 만들면서 시작하였다. 요청량이 많아도 자동으로 머신을 Scaling하여 처리할 수 있는 아키텍쳐를 설계하고 적용해볼 수 있었고, tflite를 이용하여 모바일에서의 ML 서빙을 맛보기도 하였다. 이후 가우디오랩에 입사하고 나선 본격적으로 다양한 모바일에서의 ML서빙 플랫폼들을 비교해볼 수 있었고, 이를 이용하여 사내 기술을 대표하는 하나의 데모 앱까지 완성할 수 있었다. (이에 대한 자세한 회고는 지난 회고 첫 직장, 가우디오랩에서의 8개월 에서 다루었다.)
이후 스캐터랩으로 이직하고 나서는 MLOps에 대해 더욱더 깊은 고민을 할 수 있게 되었다. 그리고, 가우디오랩에서 MLOps를 고민할 때와는 조금 다른 Point로 고민할 수 있었던 것 같다. 연구인원으로만 구성되었던 가우디오랩의 ML팀에서는 ‘어떻게 하면 연구의 Reproducibility를 높일 수 있지?’, ‘다양한 gpu머신에서의 학습을 더욱더 편리하게 추상화할 방법이 무엇인가?’등을 고민했다면, 이제는 동일한 고민점에서 시작하여 ‘엔지니어와 리서처 양쪽이 사용하기 편리한 모델 Registry나 여타 다른 Metadata Storage는 어떻게 설계하고 구축해야 하지?’, ‘어떻게 하면 끊임없이 밀려 들어오는 데이터를 학습시킬 수 있고, 이를 위해 필요한 Component는 무엇이지?’ 등 조금 더 MLOps의 깊은 부분들에 대해서 고민할 수 있었던 것 같다.
이 과정에서 MLOps에 필요한 다양한 기술들을 익힐 수 있었는데, ML 파이프라인 하면 가장 먼저 떠올랐었던 Kubeflow Pipelines부터 시작하여, Apache Beam 파이프라인을 직접 작성해볼 수도 있었고, 이를 직접 GCP의 Dataflow 위에서 구동시켜볼 수 있었다. (이렇게 많아지는 사내 Component들을 관리하기 위해 Okta를 도입하여 Access Token 기반 인증시스템을 구축하기도 해보았다!) 본격적으로 MLOps의 컴포넌트를 연결시켜볼 내년 분기가 정말 기대가 된다
심폐소생술만 하다가 결국 숨이 끊겨버린 동아리, HAI
Retrospect 2021
2021/12/31 01:05
회고
Intro : 소마를 마무리하며
작년 소프트웨어 마에스토로 11기를 마치고 회고를 작성하지도 않았으면서 지금와서 무슨 회골까 싶지만, 사실상 회사 업무가 소마의 연장선이기도 했고 첫 직장생활에서의 경험을 글로 작성해야 할 것 같아서 이렇게 남기게 되었다. (물론, 생각보다 인수인계가 일찍 끝나서 시간이 남게된 것도 영향이 크다 ~_~)
1학년 때, 대학교 공지글에 인턴 관련 내용이 있어서 바로 지원을 하고 최종합격까지 했었는데, 1학년이라는 이유로 처우협의 중 사전에 공지된 내용보다 금액을 많이 깎기도 하였고(?) 주말근무까지 해야한다는 이야기를 듣고 인턴을 포기했던 경험이 있다. 이 때 이후로 '아 그때 그래도 그냥 인턴 경험이나 해볼껄'하는 아쉬움도 있었고, 그 때문에 2학년 이후로는 실제 회사에서의 업무를 해보고 싶다는 생각이 매우 크게 들었다.
그리고 2학년때 우연히도 소프트웨어 마에스트로에 합격하게 되었고, 이 때 개인적인 목표로 소마가 끝나면 바로 인턴을 지원할 수 있을 정도로 실력을 쌓기 위해 ML Engineering에 대해서 다양한 것들을 시도하고자 하였다. AWS Lambda를 이용해서 서버리스로 ML서빙을 구현하기도 했고, TorchServe, TFServing등 잘 패킹된 라이브러리들로 만든 모델을 서빙해보기도 했었다. 또한, 소마 자율멘토링때 죽도록 들었던 쿠버네티스를 직접 써보고 싶어서 AWS EKS로 이것저것 가지고 놀아보기도 했고, Message Queue의 요청량에 따라서 자동으로 Node와 Pod를 늘이고 줄이는 아키텍처를 실제로 구현해보기도 했다.(쏘카 블로그가 많은 도움이 되었다..! : https://tech.socarcorp.kr/data/2020/03/10/ml-model-serving.html) 주제가 주제인터라 실시간으로 피아노의 소리를 듣고 어떤 음인지 맞추는것도 구현하기 위해 On-Device ML도 구현해보았다. 이런 경험을 소마 보고서에 녹여낼 수 있었고, 능력자들인 프론트엔드를 맡아준 인성이형과 백엔드를 맡아준 하균형 덕분에 Banju앱을 실제 사용 가능한 MVP로 완성시킬 수 있었다. 사실 소마를 시작할때는 "내 실력에 무슨 인증이얏...!" 하고 인증은 꿈도 못꾸고 (주변에 무서운 팀들이 많더라...) 내가 좋아하는거나 완성시키고자 했었는데, 의외로 심사평이 매우 좋았고, 덕분에 소마 11기 인증까지 받게 되었다.
Banju가 AppStore에 올라간 모습.
소마는 재밌었고, 그 안에서 만났던 다른 연수생이나 멘토님들 한분한분이 소중했다. 그리고, 소마가 끝날무렵 나는 처음에 목표로 했었던 실제 회사에서의 인턴생활을 해보고 싶어 회사들을 알아보았고, 마침 프로그래머스 윈터캠프가 그때 진행되어 회사 5군데를 지원하게 되었다. 그중 4개는 ML리서치 관련된 직군으로 지원을 했었고, 나머지 1개는 지금까지 다녔던 가우디오랩을 지원하게 되었다. 특이했던건, 가우디오랩이 채용하고 있던 직군은 ML직군이 아닌, Vue를 스택으로 하는 Front-End 직군이었던 것이다.
가우디오랩
사실 지금까지 Front-End관련된 개발이라곤 React로 만들어본 몇가지 토이프로젝트 말고는 거의 없었다. 하지만, 음악 및 오디오와 관련된 일을 해보고싶기도 했고, 여러가지 이유로(?) 가우디오랩이 마음에 끌렸다. 그렇게 해서 가우디오랩에도 이력서를 제출하게 되었는데, 나는 Front-End 관련 스택이 없었기에 별다른 기대를 하고있지는 않았다. ML리서쳐 직군으로 지원했던 회사들이 하나둘 다 떨어지기 시작했고, 나는 가우디오랩 역시 떨어질 것이라 예상하고, 마음을 접고 있었다. 그러다가 기술면접을 진행하자는 연락을 받게 되었고, 나는 최대한 빠르게 면접을 보고싶은 생각에 최대한 빠른 날짜로 면접일정을 설정했다. 하지만, 알고보니 그 날짜가 안타깝게도 소마 최종보고서 제출날이었어서 결국에 전날에 밤을 새게 되었고, 비몽사몽한 상태로 가우디오랩 면접을 볼 수밖에 없었다. 면접 전에 나는 당연히 Vue와 관련된 내용으로 면접이 이루어질 것 같아 급하게나마 공식문서를 좀 읽고 갔는데, 실제로는 그렇지 않았다. 알고봤더니 회사 내에는 AI팀이 있었고, 팀을 이끌고계신 CSO분인 밴(Ben)이 내 이력서를 보시고나서 AI직군으로 면접을 보면 어떻겠냐고 여쭤보셨다. 내 입장에서는 당연히 OK였고, 지금까지 AI과 관련된 프로젝트 경험들을 설명하면서 면접을 원활하게 진행할 수 있었다. 면접을 진행해보니, 일단 첫인상으로는 회사 내부가 카페처럼 굉장히 이뻐서 편안한(?) 기분이 들었고, 함께 면접을 봐주셨던분들도 굉장히 친절하셨어서 함께 일할때 편안하게 일할 수 있다는 생각이 들었다. 그래서 꼭 다녀보고싶다는 생각이 있었고, 이후 임원면접까지 진행하여 최종적으로 가우디오랩에 입사할 수 있었다. 소마가 11월 26일정도에 끝났는데, 빨리 입사하고 싶어서 바로 그 다음주인 12월 1일부터 입사를 하겠다고 연락을 드렸다.
첫 업무, 그리고 인턴으로의 3개월
인턴때 일했던 사무실 자리, 이후 무빙데스크로 바뀌었다..!
On-Device 모델 서빙
입사 이후, 사내에 정리되어 있던 온보딩 프로세스를 밟고, 입사 동기인 듀이(Dewey)와 함께 회사 Product에 대한 설명들을 들으며 회사에 빠르게 적응할 수 있었다. 그리고, 밴과 함께 앞으로의 업무 방향에 대해 논의를 하였는데, 인턴기간 3개월동안 첫 1개월에는 Android에서의 서빙을, 그 다음에는 iOS, 그리고 서버로의 서빙을 하는게 어떻겠냐라고 여쭈어보셨고, 나는 소마에서는 맛만 봤었던 On-Device 서빙을 더 파보고 싶어서 그렇게 업무 방향을 결정하게 되었다. 그렇게 첫번째 업무가 주어지게 되었고, PyTorch로 구현된 모델을 모바일에 서빙하는 것을 구현하기 시작했다.
구현에 제약사항이 몇가지 있었는데, 첫 번째는 오디오가 들어올 때 한 Frame씩 처리해서 실시간으로 그 Frame에 대한 결과를 내보내야 했고, 두 번째는 기존에 있던 사내의 다른 Audio Product와 엮기 위해서는 C++로 구현해야했던 점이었다. 이 두가지 모두 나에겐 처음 시도해보는 것이라 어려움이 많았지만, 그래도 새로이 도전해보는게 재미있었다. 가장 빠르게 구현할 수 있었던 방법은 PyTorch로 구현된 모델이기 때문에 PyTorch Mobile을 시도해보는 것이었다. (https://pytorch.org/mobile/home/) PyTorch에서는 libtorch라는 C++ 라이브러리를 제공하고, 이 라이브러리 안에 있는 torch::jit::script를 통해 모바일에서 C++을 통해 모델을 서빙할 수 있다. 간단하게는 아래와 같은 코드로 서빙이 될 수 있는 것이다.
첫 직장, 가우디오랩에서의 8개월
2021/07/22 01:39
회고
모바일
ML Engineer
<Copyright 2024. Daniel Kim's Dev Blog. All right reserved.>