MLOps는 개인적인 공부를 위해서 정리하는 용도이다. 개인적으로 인터넷을 통해서 공부한 내용을 기반으로 정리할 것이다.
Machine learning을 service화 하는 기술인 MLOps에 대해서 개인적으로 공부한 것을 남겨보려고 한다. MLOps는 machine learning이론, software 개발, cloud 개념이 모두 들어가서 다소 어려움이 존재할 수 있다. 만약 어떠한 특정 데이터셋에 관해서 최적의 결과를 만들어낸 model이 있다고 했을 때, 이를 재사용하기 위해서 디테일한 부분들을 바로 확인이 가능할까? Model을 만들어가면서 해당 데이터셋에 적합하게 accuracy를 올리기 위해서 다양한 시도를 하면서 값들을 바꿨을 것이다. 그래서 두번째 혹은 열번째로 성능이 좋았던 model을 바로 확인하여 재사용하기란 어려움이 존재할 것이다. 즉, 성능에 따른 model의 정보를 기억하지 못하는 경우가 대부분이다.
이번에는 model을 만들어가면서 validation dataset에서는 성능이 좋았던 model이 배포를 한 시점에서 새로운 test dataset에 대해서 성능이 좋지 않게 나올 수 있다. 그래서 성능이 가장 좋았던 model이 실패했을 경우에는 그 다음으로 성능이 좋았던 model에 대한 정보를 기억해뒀다가 test dataset에 사용해봐야 하는데 이 또한 어려움이 존재한다는 것이다. Model을 개발하는 과정부터 model과 dataset을 미리 관리하지 않았다면, 특정 경우에 대해서 model의 성능이 향상되는지 대략적인 정보만 기억에 남고 완벽하게 구현하는 것은 쉽지 않을 것이다. 따라서 개발 과정부터 관리를 하지 않으면 이후에 수정하는데 있어서 시간과 효율성이 떨어지게 될 것이다.
혼자 model을 개발한다고 했을 때, Model마다 file과 directory를 관리하고 hyper-parameter와 성능 등도 따로 정리를 잘 해가면서 개발을 했다면 기록한 내용을 기반으로 수정하는데 어려움이 없을 것이다. 하지만, 여러명이 함께 model을 개발하거나 개개인의 언어 버전이나 종류가 서로 다르다고 했을 때는 문제가 된다. 모두가 똑같은 환경에서 개발한다면 문제가 없겠지만, 모두 다른 환경이라면 다른 사람의 것을 재현하고 합치는 등의 과정에서 어려움이 생길 것이다. 혼자 공부하는 단계에서는 생각하기 어려울 수 있지만, 실제 현장에서는 대부분 여러명이 함께 작업을 하기 때문에 이러한 문제는 어디서든지 발생할 수 있다.
Machine learning model을 개발하는데 뿐만 아니라 service화까지도 문제가 많게 된다. Machine learning model을 성공적으로 service화를 하기 위해서 model 자체의 성능도 중요하지만 이후 성능이 떨어지거나 system에 문제가 발생하는지까지도 고려해야 한다. Model 자체의 검증뿐 아니라 dataset의 검증까지도 함께 이루어져야 한다. 잘 정제된 dataset에 한해서 data로부터 model을 구현하고 배포해서 service화하는 일방향적인 과정이 효과가 있게 된다. 하지만 이러한 결과는 이상적인 환경이라는 가정에서만 말이된다. 그래서 이러한 전통적인 machine learning의 한계를 극복하고자 MLOps라는 분야가 생기게 된 것이다.
과거에 software를 개발하기하는 과정은 code를 구현하고 build해서 배포하기만하면 되는 단방향의 성질이 강했다. Software 개발에 있어서도 단순하게 code를 구현하는데 끝내지 않고 요즘에는 build와 test를 자동화하고자 하고 있다. 배포하는 과정에서도 발생하는 issue들을 monitoring하여 해당하는 error에 대한 test를 다시 수행하도록 하고 있다. 즉, 이렇게 개발하면서 배포하는데 있어서 계속해서 관리하고 반영하고자하는 DevOps라는 분야가 생기게 된 것이다. DevOps의 등장으로 단순히 code를 구현하는 것 외에 모두 정리가 되면서 기술적이고 문화적인 발생이 생기게 되었다.
이와 같은 방식으로 machine learning 개발에 있어서도 자동화와 monitoring의 필요성을 느끼게 되었다. 그래서 machine learning model을 만드는 과정에 DevOps의 개념을 접목시킨 것이 바로 MLOps가 되는 것이다. Machine learning model을 service화 하는데 있어서 기본이 되는 요소인 data 버전 관리과 model 버전 관리 등과 같은 요소들은 software 개발에서도 git과 같은 툴을 이용해서 하고 있었으며, model 학습 자동화와 성능 평가 자동화 등의 요소들도 software 개발에서 이미 다양한 방법론들을 적용하고 있었다. 그리고 model에 관한 전반적인 monitoring 과정은 이미 software 개발에서 안정적인 방법론 등을 사용하고 있었다. 이러한 맥락이 맞아들어가서 DevOps 분야를 machine learning 분야에 접목시키게 된 것이다.
다만, DevOps와 똑같이 하기에는 machine learning service에는 model 외에 data도 존재하기 때문에 불가능했다. 이제는 model보다도 data의 중요성이 더 커져서 data 중심의 service가 핵심이 되었다. 그래서 DevOps와는 같으면서도 다른 MLOps라는 분야가 생기게 된 것이다. Google에서는 MLOps가 ML 시스템 개발(Dev)과 ML 시스템 운영(Ops)을 통합하는 것을 목표로 하는 ML 엔지니어링 문화 및 방식이라고 정의하고 있다.
MLOps의 구성요소는 data, model, serving과 같이 크게 3가지로 나눌 수가 있다. Data와 관련된 기능은 다시 data 수집 pipeline, data 저장, data 관리로 나눌 수 있다. 각각의 기능에는 유명한 software들이 존재하게 되어 필요할 때 동일한 기능을 하는 것을 사용하면 된다. Data 수집 pipeline에서는 data 수집 단계부터 전처리와 logging이 해당하게 되는데 pipeline 전체에 관련된 Apache Sqoop, Flume, Kafka, Flink, Spark Streaming, Airflow 등의 software가 있다. Data 저장 software로는 MySQL, Hadoop, Amazon S3, MinIO 등이 있고, data 관리 software로는 TFDV, DVC, Feast, Amumdsen 등이 있다.
Model 관련된 기능으로는 model 개발, model 버전 관리, model 학습 scheduling 관리로 나눌 수 있다. Model 개발을 격리된 환경에서 할 수 있는 Jupyter Hub, Docker, Kuberflow, Optuna, Ray, Katib 등이 있다. Model 버전 관리에는 Git, MLflow, Github Action, Jenkins 등이 있고, GPU 학습 관리나 model 학습 scheduling 관리에는 Grafana, Kubernetes 등이 있다.
Serving도 중요한 요소로 data로부터 model의 function을 불러서 결과값을 반환하는 행위 자체를 사용자가 code를 직접 돌리는 것이 아닌 서버에서 API 형태로 제공하는 service를 말한다. 그래서 접근성이 뛰어나지고 기존의 서버보다 더 좋은 환경에서 model을 돌려볼 수 있도록 하는 것이 serving이다. Serving은 model packaging, serving monitoring, pipeline managing으로 나눌 수 있다. Model packaging은 Docker, Flask, FastAPI, BentoML, Kuberflow, TFSErving, seldon-core 등이 있다. Serving 후에 환경이 잘 돌아가고 있는지 지속적으로 monitoring해서 문제가 생기면 알람을 받는 자동화를 도와주는 툴로는 Prometheus, Grafana, Thanos 등이 있다. 그리고 성능 확인을 위해서 이전 model 학습 과정 전부를 돌려보기 위해서 개발 과정부터 특정한 pipeline으로 개발을 해야 재사용이 가능해지는데, 이를 도와주는 툴로는 Kuberflow, argo workflow, Airflow 등이 있다.
이러한 대부분의 기능들을 제품으로 제공하고 있는 회사들이 존재한다. Amazon, Google, Microsoft에서 각각 Aws SageMaker, GCP Vertex AI, Azure Machine Learning과 같은 이름으로 SAS(Software as a Service) 형태로 제공해주고 있다.