안녕하십니까, 저는 배달의 민족의 MLOps를 활용한 AI서비스에 대해 소개해드릴 코드 1기 이채영입니다.
[우아한테크세미나] MLOps를 활용한 AI 서비스 개발 스토리 - YouTube
들어가기에 앞서, 배민 어느 곳에 AI 서비스가 적용되어 있을까요?
여러분들이 주문하고 리뷰를 남기실 때, 곳곳에 AI 서비스가 적용되어 있습니다.
왼쪽 사진은 개인정보가 노출된 영수증이나 음식과 상관없는 이미지 등과 같이 리뷰에 올라가기에 부적절한 이미지를 걸러주는 리뷰 이미지 검술 서비스입니다. 오른쪽은 배달 예상 시간 서비스로, 지금 시키면 얼마나 걸릴지/ 예상 시간을 보여주는 서비스와 주문을 했을 때 라이더가 음식을 가지고 도착할때까지의 시간을 보여주는 서비스입니다. 이 서비스들은 배민1, 일반배달, 배민 B마트에 적용되어 있습니다. 이와 같이 배달의 민족 서비스 이곳저곳에 수십개의 AI서비스가 이미 적용되어 있습니다.
저는 앞으로 배민이 어떻게 효율적으로 AI 서비스를 개발할 수 있게 되었는지, 그 고민한 결과는 무엇인지 살펴보도록 하겠습니다.
1. AI서비스 개념과 MLOps 도입배경
AI 서비스를 이해하려면 모델에 대한 이해가 필요합니다. 모델은 데이터를 통해 특정 유형의 패턴을 인식하도록 학습된 파일을 의미하고, 이렇게 생성된 모델 파일을 서비스에 적용하고 있습니다.
그렇다면 모델은 누가 만들고 서비스에는 누가 적용할까요?
데이터 과학자는 모델을 담당하고, 엔지니어는 데이터 과학자가 품질 좋은 모델을 빠르게 만들 수 있게 필요한 기능을 제공하고, 만든 모델을 서비스에 적용하고 있습니다.
하지만, 기존의 AI서비스에는 몇 가지 문제점이 있었습니다.
기존에는 AI서비스 개발자와 엔지니어가 페어로 시스템을 구성했습니다. 이런 구성에서는 AI서비스개발자와 엔지니어어 사이에 싱크를 맞추는 작업들이 반복적으로 발생하고 엔지니어간 서비스 개발자 간 협업이 쉽지 않습니다. 개발자 간 소스코드공유가 잘 되지 않아 공통로직을 재사용할 수 있는 환경이 되기 힘들었습니다. 또한 개발환경과 운용환경이 달라 각각의 환경에 맞춰서 구성을 해야하고 이런 작업에서는 휴먼 에러가 발생할 수 있습니다.
따라서 이러한 문제들을 해결하고 높은 품질의 모델을 신속하게 개발, 지속적으로 운영 가능한 AI 서비스를 구축하기 위해 배민은 MLOpS를 도입했습니다.
MLOps는 머신러닝 엔지니어링 문화와 방식으로, 머신러닝 시스템 개발과 시스템 운영을 통합하여 안정적이고 효율적인 머신러닝 모델 배포와 유지 관리가 목표입니다. 아래 그림에서 볼 수 있듯이 세 가지 분야의 교차점에 있는 MLOps는 머신러닝 모델의 개발, 테스트, 배포, 그리고 관리/ 전 과정을 자동화하고 최적화하여 더욱 빠르고 효율적인 머신러닝 솔루션을 만드는 것을 목표로 합니다.
- Machine Learning: 데이터를 분석하고 학습하여 AI 모델을 생성하는 분야
- Data Engineering: 데이터를 수집, 저장, 처리 및 분석하는 기술을 개발하는 분야
- DevOps: 소프트웨어 개발에서 자동화, CI/CD(지속적인 통합 및 지속적인 배포)와 같은 개발 프로세스를 자동화하고 팀 간 협력을 강화하여 개발 프로세스를 효율화하는 분야
따라서 배민은 MLOps를 담아 AI 플랫폼이라는 이름으로 구성을 하고, 기존에는 AI서비스 개발자가 엔지니어와 페어로 서비스를 만들었다면/ 이제는 AI 플랫폼을 중심으로 엔지니어는 필요한 공통기능을 개발하고, AI서비스 개발자는 플랫폼을 활용해 서비스를 개발할 수 있도록 환경을 구성했습니다.
쉽게 말해, AI 서비스 개발자와 엔지니어 모두 AI 플랫폼에만 집중하면 돼서 이전의 문제들이 해결이 되는 것입니다.
2. MLOps AI서비스의 구체적인 기능
우아한 형제들은 초기 MLOps 도입 시, 서비스 개발자들의 의견 수렴뿐 아니라 참고할 자료가 필요해 MLOps: Continuous delivery and automation pipelines in machine learning와 Machine Learning Operations (MLOps): Overview, Definition, and Architecture를 참고했습니다. 이들 자료에서는 머신러닝 모델 개발 및 배포를 위한 MLOps의 개념, 구성요소, 그리고 MLOps의 레벨 3단계와 각 레벨의 특징에 대해 설명하고 있습니다. 참고 자료를 토대로 다음과 같은 작업을 초기 MLOps 도입 시 진행했습니다. MLOps 각 레벨별로 필요한 기능들을 나열하고, 문제를 명확하게 정의하고, 각 작업의 우선순위를 결정했습니다.
MLOps의 레벨은 0부터 2까지 있고 각 단계는 다음과 같습니다.
가장 왼쪽에 보이시는 레벨 0에서는 데이터 과학자가 모델을 빌드하고 배포하는 과정이 완전히 수동으로 이루어지며, 이는 환경의 동적인 변화나 데이터의 변화에 대응하기 어려울 수 있습니다. 레벨 1은 머신러닝 파이프라인 자동화를 통해 지속적으로 모델을 학습하고 서비스에 제공하여 모델의 품질을 유지하는 것을 목표로 합니다. 마지막으로, 레벨 2는 CI/CD 파이프라인 자동화를 통해 데이터 과학자가 아이디어를 구현하고 파이프라인 구성 요소를 대상 환경에 자동으로 빌드, 테스트, 배포할 수 있도록 지원합니다.
참고로 현재 배달의 민족의 레벨은 1.5단계에 있다고 합니다.
MLOps 레벨 2를 달성하기 위해 배민은 현재의 환경에서 문제를 정의하고, 이를 해결함으로써 AI 서비스 개발에 어떤 효과가 있을지 확인해야 했습니다. 따라서 다음과 같이 문제를 정의했습니다.
다음은 우아한 형제들이 문제를 해결한 과정입니다. 우아한 형제들의 우아한 기술블로그를 참고하였습니다.
2-1. 개발 환경과 운영 환경의 갭 줄이기
개발 환경과 운영 환경이 일치하지 않으면 운영 환경에 서비스를 배포하기 전에 환경을 일치시키는 작업이 필요합니다. 예를 들어, 개발 환경에서 사용했던 파이썬 버전과 의존성 패키지들을 운영 환경에서도 동일하게 설치해야 합니다.
프로젝트를 한 번만 배포한다면 환경을 동일하게 만드는 작업이 번거롭지 않을 수 있습니다. 그러나 여러 개의 프로젝트를 여러 번 반복해 배포해야 한다면 실제 개발보다 배포에 더 많은 시간이 소요됩니다. 서비스를 개발하는 개발 환경과 운영 환경을 일치시키기 위해서 아래와 같은 방법으로 문제를 해결하였습니다.
- AI 관련 소스 코드 저장소 ML Projects 도입
- 클라이언트 Docker 이미지 개발
- 프로젝트별 개발 환경 구성
결과적으로 모델을 개발하고 서비스까지 릴리스하는 프로세스를 간소화하는 효과를 얻을 수 있었습니다.
2-1-1. AI 관련 소스 코드 저장소 ML Projects 도입
AI 관련 소스 코드 저장소인 ML Projects라는 새로운 저장소를 도입했습니다. 이 저장소는 AI에 관련된 데이터 처리부터 모델 학습/예측, 결과물 내보내기, 실험, 데모, 서빙 등 코드를 모아놓는 곳입니다.
여기 저장된 디렉터리 구조와 각각의 역할을 설명해드리겠습니다. 'Machine Learning의 규칙: ML 엔지니어링을 위한 Best Practices'에 따르면 Rule #32에서는 "가능한 학습 파이프라인과 서빙 파이프라인 사이에서 코드를 재사용하세요" 라는 것이 나옵니다. 즉, 가능하다면 학습과 서빙 파이프라인에서 코드를 공유하는 것이 중요하다는 거죠. 그래서 우아한 형제들은 모든 코드를 한 곳에서 관리하는 게 좋다고 생각했습니다.
예를 들어, 학습에 쓰이는 전처리 코드는 서빙이나 데모에서도 재사용됩니다. 만약 학습과 서빙에서 다른 전처리 코드를 사용하면, 서비스 품질이 떨어질 수 있고 편향이 생길 수도 있습니다. 또한, 각 프로젝트의 코드와 환경을 한 곳에서 관리하면, 다른 사람이나 다른 환경에서도 일관된 실행이 가능해질 겁니다.
ML Projects는 '모노레포(monorepo)' 방식을 통해 모든 프로젝트를 하나의 저장소에서 관리하고 있습니다. 이렇게 하면 모든 프로젝트를 한 곳에서 관리할 수 있어서 CI/CD도 더 효율적으로 구성할 수 있습니다. CI/CD를 이용하면 개발 및 운영 단계에서 공통 테스트, 빌드, 배포를 자동화할 수 있고 결과에 대한 빠른 피드백도 얻을 수 있습니다. 현재는 AI 서비스 개발자들이 각자의 코드를 공유하고 협업하고 있습니다. 이렇게 소스 코드를 공유하면 품질을 높이고 코드 재사용성도 늘릴 수 있습니다.
2-1-2. 클라이언트 Docker 이미지 개발
클라이언트 Docker 이미지는 모델을 개발할 때 필요한 여러 기능을 제공합니다. 현재는 프로젝트 실행, Jupyter Notebook, 그리고 데이터 조회 기능 등을 포함하고 있습니다.
프로젝트 실행 시에 개발한 소스 코드는 로컬 개발 환경이 아닌 컨테이너 환경에서 실행되며, 개발 환경에서 실행되는 컨테이너는 운영에서 실행되는 컨테이너와 동일한 환경을 보장합니다. 개발 환경과 운영 환경을 일치시켜 운영 배포를 위한 추가 작업이 없어졌습니다. 모든 코드가 컨테이너 환경에서 실행되기 때문에 확장성과 유연성 측면에서도 이점을 가집니다.
데이터 수요에 맞는 리소스 추정이 어려운 경우, 확장성 있는 학습 인프라가 필요합니다. 배민은 데이터플랫폼팀에서 구성한 EKS-A가 확장성 측면에서 장점이 있다고 판단했고, EKS-A 환경에서 CPU 또는 GPU 리소스를 유연하게 할당받아 컨테이너 내에서 학습을 진행하고 있습니다. 또한, 소스 코드를 변경하지 않고 컨테이너를 여러 개 띄우는 방식으로 하이퍼파라미터 튜닝도 가능해졌습니다.
2-1-3. 프로젝트별 개발 환경 구성
각 프로젝트는 파이썬 버전, 빌드 의존성, 패키지 의존성을 요구하기 때문에 각각의 프로젝트에서 별도로 환경을 관리할 필요가 있었습니다. 현재는 각 프로젝트에서 사용할 파이썬 버전, 빌드 의존성, 패키지 의존성을 명시하고, 이를 코드 실행 시에 사용하고 있습니다. 이를 통해 개발 환경에서 사용한 환경을 운영 환경에서 그대로 사용할 수 있으며, 하나의 클라이언트 Docker 이미지로 실행할 수 있게 되었습니다.
2-2. 파이프라인 구성을 효율적으로
모델을 만들고 서비스로 출시하기 위해서는 여러 프로세스로 구성된 파이프라인 필요합니다. 파이프라인이란 여러 단계의 작업을 순차적으로 연결하여 자동화하는 프로세스를 의미하는 것으로, 일반적으로 데이터 수집, 전처리, 특성 추출, 모델 훈련, 평가 및 모델 배포 단계로 구성됩니다. 이러한 파이프라이닝은 코드를 모듈화하고 재사용성을 높이며, 실험과 최적화를 쉽게 수행할 수 있습니다. 또한, 파이프라인을 자동화하고 확장할 수 있게 구현함으로써 프로세스를 더욱 효율적으로 관리할 수 있습니다.
파이프라인은 배포하는 단위가 되며, 배포된 파이프라인은 지속적으로 설정된 스케줄로 실행됩니다. 우아한형제들에서는 파이프라인을 생성하고 관리를 효율적으로 구성하기 위해 자체 개발한 Pipeline Builder(이하 PB) 패키지를 사용합니다. PB는 DagFactory와 Kustomize 방법론을 참고하여 YAML 형태로 작성된 파이프라인을 환경에 따라 동적으로 생성합니다.
2-3. 데이터 과학자는 모델 개발에 집중하게
실제 AI 서비스를 개발하기 위해 작성해야 하는 코드는 데이터 로드, 모델 빌드, 모델 학습, 결과 저장 등 다양한 과정을 포함합니다. 이러한 코드에는 공통으로 개발하는 기능들이 있습니다.
우아한 형제들은 SDK를 통해 공통 기능들을 제공하여 데이터 과학자가 모델의 핵심 알고리즘에 집중할 수 있는 환경을 만들기 위해 노력하고 있습니다. SDK를 제공함으로써 코드 재사용성을 극대화하고 모델 생성 및 서비스 적용에 필요한 시간을 단축할 수 있습니다. 그럼 공통 기능에는 무엇이 있을까요?
- 데이터를 업로드/다운로드 기능
- 실험 설정 및 기록
- 전처리(데이터 정제/변환/스케일링 등)
- 대규모 데이터 입력 파이프라인
- 피쳐 스토어(Feature Store) 연동
- 각종 환경별 설정값 관리
데이터 과학자에게 설문조사를 진행한 결과, 데이터 업로드/다운로드 기능이 번거로운 과정 중 하나였습니다. 데이터 과학자가 직접 구현하지 않아도 학습에 필요한 데이터를 다운로드하고, 결과를 업로드하는 기능을 SDK로 제공했습니다.
데이터 과학자는 반복적인 실험을 통해 최종 모델을 선택합니다. 이 과정에서도 SDK가 사용되며, 데이터 과학자는 SDK를 통해 실험을 생성하고, 생성된 실험 이력은 SDK를 통해 DB에 저장하고 있습니다. 반복적인 실험을 수행한 이후에는 웹 페이지에서 실험 정보와 결과를 확인할 수 있습니다. 실험 설정 및 로깅을 통해 모델의 재현성과 추적성을 보장할 수 있으며, 실험을 통해 생성된 아티팩트(예: 모델, 환경 정보 등) 또한, 관리할 수 있습니다.
우아한 형제들은 SDK를 설계하고 개발할 때 가장 중요하다고 생각하는 것은 데이터 과학자와 엔지니어의 기여라고 생각했습니다. 초반에는 소수의 MLOps 개발자가 기능을 구현했지만, 이제는 과학자와 엔지니어가 함께 구현하고 있습니다. 또한, 외부 플랫폼을 도입할 때도 SDK를 통해 쉽게 개발할 수 있도록 기능을 제공하고 있습니다.
현재도 AI 서비스를 개발하면서 필요한 공통 기능들을 추가 및 사용하고 있고, 주기적으로 데이터 과학자들에게 필요한 기능이 무엇인지, 작업 중에 가장 번거로운 부분을 파악하여 새로운 기능을 추가하고 있습니다.
2-4. 간결한 가이드
우아한 형제들의 목표는 쉽고 간결하게 설명할 수 있는 플랫폼을 만드는 것입니다.
가이드 문서를 작성해 보면서 우아한 형제들의 AI 플랫폼의 사용성에 대해서도 부족한 점을 고민해 보고 그 고민들이 과제로 이어지고 있습니다. 개발자들이 플랫폼을 쉽게 사용할 수 있도록 작성된 운영 정책, 컴포넌트에 대한 설명, 예제 및 FAQ 등을 제공하고 있습니다. 잘 작성한 가이드를 제공해 운영 리소스를 줄이면서 MLOps 핵심 기능 개발에 집중할 수 있는 환경을 만들고 있습니다.
3. AI 플랫폼 적용 사례
마지막으로 앞서 설명드린 AI 플랫폼을 알뜰 배달 서비스에 어떻게 적용했는지 그 과정을 간단하게 소개하겠습니다.
알뜰 배달은 여러 요소를 고려하여 다 건의 주문을 묶어서 배달하는 신규 서비스입니다. 알뜰 배달을 포함하여 많은 서비스에서 각종 시간을 예측하고 있는데, 이 중 알뜰배달의 배달 시간 예측 서비스의 요구사항을 간단히 보겠습니다.
딥러닝 모델이 적용되었으며 요일, 주문, 주문 시간대, 거리와 같은 피처는 물론이고 날씨, 라이더 분들이 얼마나 계신지, 실제로 배달을 하고 계신 비율은 얼마만큼 있는지 등을 실시간으로 측정하고 그 피처를 사용하고 있습니다. 주기적으로 학습을 하며 모델을 업데이트해야 하며, 준 실시간, 데일리 배치 서빙이 모두 필요했습니다. 따라서 여러 파이프라인을 개발 및 관리해야했습니다.
이에 맞게 배민은 MLPps를 적용했다고 보시면 될 것 같습니다.
지금까지 배달의 민족의 MLOps를 이용한 AI서비스 도입기 및 기능과 예시를 살펴보았습니다. 읽어주셔서 감사합니다.
'Study > 개발자 블로그' 카테고리의 다른 글
[개발자 블로그 탐독] Factorization Machine 모델로 아이템 추천하기! (2) | 2023.12.21 |
---|---|
메이플스토리를 만드는 사람들, Maple Us (1) | 2023.12.06 |
[개발자 블로그 탐독] 뷰티 필터를 개발하며 얻은 새로운 경험 (1) | 2023.12.05 |
[개발자 블로그 탐독] 리멤버 앱의 AI 명함 촬영 인식 기능 - 리오(RIO) (1) | 2023.12.05 |
카카오 AI추천 : 토픽 모델링과 MAB를 이용한 카카오 개인화 추천 (2) | 2023.12.05 |