[AI 서비스] Docker & MLflow

Docker

(소프트웨어) 가상화란?

대개 서비스 운영에 사용하는 서버에서 개발하지 않는다. 제작하는 장소와 운영하는 장소가 분리되어 있다는 말이다. 그래서 개발을 진행한 로컬 환경과 production(운영) 서버 환경이 다른 경우, 예를 들어서 os가 다르다면 라이브러리 따위를 설치하는 방법을 다르게 진행해야 한다. 또는 로컬 환경과 서버가 같은 os를 사용해도 정작 서버에서 제대로 작동 안할 수도 있다. 보통 이런 에러를 방지하기 위해 README 파일이 있긴 하다.

하지만 서버 환경도 모두 소프트웨어화 할 순 없을까? 그러니까 어느 상황에서든지 사용할 수 있게 만들어보자는 제안이다.

특정 소프트웨어 환경을 만들어서 로컬, 운영 서버에서 그대로 활용할 수 있게 하는 게 가상화. 다시 말해 이렇게 하면 개발과 운영 서버의 환경 불일치가 해소된다. 따라서 동일한 환경으로 프로그램을 실행 가능하다.

주로 VM(Virtual Machine)을 가상화 기술로 사용하는데, VM은 호스트 머신이라고 하는 실제 컴퓨터에 OS를 포함한 가상화 소프트웨어를 두는 방식이다. 하지만 VM은 리소스를 많이 사용해서 무겁다. 이를 해결하기 위해 container(VM의 무거움을 크게 덜어주면서 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술)가 있다. 그리고 container 기술을 쉽게 사용할 수 있도록 나온 도구가 Docker.

Docker

Docker의 핵심 개념은 두 가지이다.

  • Docker image
  • Docker container

Docker image를 설정하면 재부팅 했을 때 Docker image 상태로 실행된다…원 상태로 도르마무. 즉, Docker image는 container를 실행할 때 사용할 수 있는 템플릿이다. 읽기만 가능하다.
Docker container는 docker image를 활용해 실행된 인스턴스이며 쓰기가 가능하다.

이처럼 Docker를 이용해서 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있다. 이는 깃허브와 유사하다.

마찬가지로 자신만의 Docker image를 만들면 공유가 가능하다. 원격 저장소에 저장하면 어디서나 사용할 수 있다는 뜻인데, 이러한 원격저장소를 container registry라고 한다. 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 이를 서버에서 받아서 실행한다.

기본 명령어

  • docker pull “이미지 이름:태그” : 필요한 이미지 다운
  • docker images : 다운받은 이미지 목록 확인
  • docker run “이미지 이름:태그” : 이미지를 기반으로 컨테이너 생성
  • docker ps : 실행중인 컨테이너 목록 확인
  • docker exec -it “컨테이너 이름(ID)” /bin/bash : 컨테이너에 진입
  • docker stop “컨테이너 이름(ID)” : 실행중인 컨테이너를 중지
  • docker rm “컨테이너 이름(ID)” : 중지된 컨테이너 삭제

도커 이미지 만들기

  • 파이썬 환경 및 애플리케이션 코드를 작성
  • Dockerfile 작성
    • FROM으로 베이스 이미지를 지정
    • COPY로 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
    • WORKDIR로 RUN, CMD 등을 실행할 컨테이너 내 디렉토리 지정
    • RUN으로 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행
    • CMD로 이미지 실행 시 바로 실행할 명령어를 지정
  • docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그” 으로 이미지 빌드
  • docker run “이미지 이름:태그”로 빌드한 이미지를 실행



MLflow

이게 없던 시절엔 사람들이 각자의 코드를 주피터 노트북에서 작성하고, 모델 학습에 사용한 파라미터와 metric을 따로 기록했었다.

  1. 실험을 추적하기 어렵다
  2. 코드를 재현하기 어렵다
  3. 모델을 패키징하고 배포하는 방법이 어렵다
  4. 모델 관리를 위한 중앙 저장소가 없다

MLflow는 위의 문제들을 해결하고 머신러닝 실험 및 배포를 쉽게 관리할 수 있는 오픈소스다. 그러니까 이걸 사용한다면 다음과 같은 효과를 얻는다.

  • 머신러닝 파라미터, 모델 구조 등을 기록해서 어떤 방법이 좋았는지 알 수 있게 한다.
  • 시행착오 기록
  • 기록을 바탕으로 가장 성능이 좋았던 걸 찾을 수 있다.
  • 추가로 모델 작동 과정에서 발생하는 결과물들을 다 저장
  • 또한 여러 모델 운영 가능

핵심 기능

  1. experiment management & tracking
    • 실험들을 관리하고, 각 실험 내용 기록
    • 실험을 정의하고 실행
  2. model registry
    • 엠엘플로우로 실행한 모델을 model registry(모델 저장소)에 등록할 수 있다.
    • 등록되는 순간 모델 버전이 자동으로 업데이트 된다.
    • 등록하면 다른 사람에게 공유 가능

이는 깃허브랑 도커랑 유사하다.

  1. model serving
    • 등록한 모델을 rest api형태로 서빙

MLflow componet

  1. MLflow tracking
    • 머신러닝 코드 실행, 로깅하는 api, ui
    • 이에 따른 결과를 로컬이나 서버에 기록해 다른 실행과 비교 가능
  2. MLflow project
    • 머신러닝 프로젝트 코드 패키징 표준
  3. MLflow model
    • 모델을 모델 파일과 코드로 저장
    • 다양한 플랫폼에 배포할 수 있도록 도구 제공
    • MLflow tracking api는 자동으로 해당 프로젝트 내용을 사용
  4. MLflow registry
    • MLflow model 전체 라이프 사이클에서 사용할 수 있는 중앙 모델 저장소