[부스트캠프 AI tech AI서비스개발기초] week05 (2022.02.17)

redgreen·2022년 2월 17일
0

04 Docker

가상화란?

: 개발할 때, 서비스 운영에 사용하는 서버에 직접 들어가서 개발하지 않음. Local 환경에서 개발하고, 완료되면 Staging서버, Production 서버에 배포
: 개발을 진행한 Local 환경과 Production 서버 환경이 다른 경우
: Local 환경과 서버가 같은 OS를 사용해도 서버에서 올바르게 작동하지 않을 수 있음(환경변수, permission...)
: 다양한 설정을 README 등에 기록하고, 항상 실행하도록 하는 방법 -> 오류가 있을 수 있음

  • 특정 소프트웨어 환경을 만들고, Local, Production 서버에서 그대로 활용
    • 개발(Local)과 운영(Production) 서버의 환경 불일치가 해소
    • 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음
    • 개발 외에 Research도 동일한 환경을 사용할 수 있음

  • Docker 등장 전 - VM


    : VM은 호스트 머신이라고 하는 실제 물리적인 컴퓨터 위에 OS를 포함한 가상화 소프트웨어를 두는 방식(GCP의 compute engine, AWS EC2)
    : OS 위에 OS를 하나 더 실행시킨다는 점에서 굉장이 많은 리소스를 사용함, 무거움

  • Container

    : VM의 무거움을 크게 덜어주면서, 가상화를 좀 더 경량화된 프로세스의 개념으로 만든 기술, 빠르고 가볍게 가상화를 구현할 수 있음

  • Docker

    : container 기술을 쉽게 사용할 수 있도록 나온 도구

  • Docker Image

    : 컨테이너를 실행할 때 사용할 수 있는 template
    : Read only
    : 다른 사람이 만든 소프트웨어, OS, 설정을 포함한 실행환경
    : Linux, Window, Mac 어디에서나 동일하게 실행 가능

  • Docker Container

    : Docker Image를 활용해 실행된 인스턴스
    : Write 가능

  • Docker로 할 수 있는 일

    : 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음 ex)MySQL, Jupyter Notebook을 Docker로 실행
    : 자신만의 이미지를 만들면 다른 사람에게 공유할 수 있음
    : 원격 저장소: Container Registry
    • 회사에서 서비스를 배포할 때는 원격 저장소에 이미지를 업로드하고, 서버에서 받아서 실행하는 식으로 진행
    • dockerhub, GCR, ECR 등

Docker 실습

  • docker desktop 설치/실행

  • 설치 후, 터미널에서 docker 커맨드가 동작하는지 확인



  • docker pull '이미지이름':'태그'

    mysql 8버전 이미지를 다운


  • 다운받은 이미지 확인

    docker images


  • docker 실행하기

    -docker run '이미지이름:태그'
    -다운받은 이미지 기반으로 Docker Container를 만들고 실행


    --name "": Container 이름 설정
    -e: 환경변수 설정
    -d: 데몬(백그라운드)모드, nohup과 유사
    -p local_port:container_port: 로컬포트 접근 시 컨테이너 포트로 연결되도록 설정

  • 실행한 컨테이너 확인

    docker ps


  • 컨테이너 진입

    docker exec -it "컨테이너이름(혹은 ID)" /bin/bash"
    • MySQL이 실행되고 있는지 확인하기 위해 컨테이너에 진입
    • Compute Engine에서 SSH와 접속하는 것과 유사

  • MySQL 프로세스로 들어가면 쉘화면이 보임

    mysql -u root -p


  • 컨테이너 작동상태 확인

    docker ps -a: 작동을 멈춘 컨테이너도 보여줌
    docker ps: 실행중인 컨테이너 목록만 보여줌


  • 멈춘 컨테이너를 삭제

    docker rm "컨테이너 이름(ID)"
    docker rm "컨테이너 이름(ID)" -f: 실행중인 컨테이너도 삭제가능

  • 정리



  • docker run할 때 파일을 공유하는 방법

    • Docker Container 내부는 특별한 설정이 없으면 컨테이너를 삭제할 때 파일이 사라짐(Host와 Container 간 파일공유가 되지 않음)
    • 파일을 유지하고 싶다면 Host와 Container의 저장소를 공유해야함
    • Volume Mount
      : Volumne Mount를 진행하면 Host와 Container의 폴더가 공유됨
      : -v 옵션을 사용하며, -p(Port) 처럼 사용함.
      ex. -v Host_Folder:Container_Folder

  • : Dockerhub에 공개된 모든 이미지를 다운받을 수 있음
    : 필요한 이미지를 찾아 실행

직접 Docker Image 만들기

  • python 가상환경 세팅
    python -m venv "가상환경이름"

  • 가상환경실행 (Windows)
    "가상환경이름"\Scripts\activate.bat

  • fastapi 설치
    pip install "fastapi[all]"

  • FastAPI 코드 작성
    cmd 창에서 touch main.py 파일 생성
    code main.py: vscode에서 열기

  • 사용한 라이브러리 명시
    pip freeze: 설치한 라이브러리를 모두 보여줌
    pip list --not-required --format==freeze: 다른 패키지에 의해 설치된 라이브러리는 보이지 않음
    pip freeze > requirements.txt: 라이브러리 목록을 requirements.txt에 저장

  • Dockerfile 만들기
    touch Dockerfile: 파일 생성
    code Dockerfile: vscode 실행 및 작성
    FROM "이미지이름:태그"
    : 이미지 빌드에 사용할 베이스 이미지를 지정
    : 보통 공개된 이미지(dockerhub)를 기반으로 새로운 설정 추가
    COPY "로컬디렉토리(파일)" "컨테이너 내 디렉토리(파일)"
    : 컨테이너는 자체적인 파일시스템과 디렉토리를 가짐
    : Dockerfile이 존재하는 경로 기준 로컬디렉토리컨테이너 내부의 디렉토리로 복사
    : 해당코드는 프로젝트 최상위에 존재하는 모든 파일을 컨테이너 내부 /app 디렉토리로 복사
    : 파일을 컨테이너에서 사용하려면 COPY 명령어로 반드시 복사해야함
    WORKDIR "컨테이너 내 디렉토리"
    : Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너 경로 지정
    ENV "환경변수 이름=값"
    : 컨테이너 내 환경변수를 지정
    : 파이썬 애플리케이션의 경우 통상 위 두 값을 지정
    RUN "실행할 리눅스 명령어"
    : 컨테이너 내에서 리눅스 명령어 실행
    : 한번에 여러개의 명령어를 실행할 경우 &&\로 이어줌
    CMD ["실행할 명령어", "인자", ...]
    :docker run으로 이 이미지 기반으로 컨테이너를 만들 때, 실행할 명령어
    : 이 이미지는 실행되는 즉시 python main.py를 실행

  • build
    docker build "Dockfile이 위치한 경로"
    -t "이미지이름:태그" 옵션으로 이미지 이름과 태그를 지정
    : 태그는 미지정시 latest로 채워짐

  • 빌드한 이미지 확인/실행

    docker images: 빌드한 이미지 확인
    docker run -p "로컬포트":"컨테이너포트" "이미지이름:태그": 이미지 실행, 태그가 latest인 경우 생략가능

  • 애플리케이션 작동확인
    curl

  • 정리

05 MLflow

MLflow 개념잡기

MLflow가 없던 시절

  • 각자 자신의 코드를 Jupyter Notebook에 작성
  • parameter, metric을 따로 기록(spread sheet)
  • 개인 컴퓨터, 연구실 서버를 사용하다가 메모리 초과(memort exceed) 오류발생
  • 학습하며 생긴 weight file을 저장해 공유
  • weight file 이름으로 model versioning을 하거나 아예 versioning을 하지 않음

MLflow가 해결하려고 했던 pain point

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

MLflow

: 머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스
: CLI, GUI(웹인터페이스) 지원

  • code 예시

MLflow의 핵심기능

1) Experiment Management & Tracking

  • 머신러닝 관련 실험들을 관리하고 내용을 기록
    ex. 여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유할 수 있음
  • 실험을 정의하고, 실험을 실행
  • 각 실행에 사용한 소스코드, 하이퍼파라미터, metric, 부산물(모델, chart) 등을 저장

2) Model Registry

  • MLflow로 실행한 모델을 Model Registry(모델 저장소)에 등록할 수있음(저장될 때마다 자동으로 versoning)
  • ModelRegistry에 등록된 모델은 다른 사람들에게 쉽게 공유 및 활용 가능

3) Model Serving

  • Model Registry에 등록한 모델을 REST API 형태로 서버로 Serving할 수 있음
  • 직접 Docker Image를 만들지 않아도 생성 가능

MLflow Component

1) MLflow Tracking

  • 머신러닝 코드 실행, 로깅을 위한 API, UI
  • MLflow Tracking 결과를 Local, Server에 기록해 여러 실행과 비교할 수 있음
  • 다른 사용자의 결과와 비교하며 협업가능

2) MLflow Project

  • 머신러닝 프로젝트 코드를 패키징하기 위한 표준
  • Project
    • 소스 코드가 저장된 폴더
    • Git Repo
    • 의존성과 어떻게 실행해야 하는지 저장
    • MLflow Tracking API를 사용하면 MLflow는 프로젝트 버전을 모든 파라미터와 자동으로 로깅

3) MLflow Model

  • 모델은 모델 파일과 코드로 저장
  • 다양한 플랫폼에 배포할 수 있는 여러 도구 제공
  • MLflow Tracking API를 사용하면 MLflow는 자동으로 해당 프로젝트에 대한 내용을 사용함

4) MLflow Registry

  • MLflow Model의 전체 Lifecycle에서 사용할 수 있는 중앙 모델 저장소

MLflow 실습

MLflow 설치

pip install mlflow

Experiment

  • MLflow에서 제일 먼저 Experiment 생성
  • Experiment: 머신러닝 프로젝트 단위로 구성
    ex. 개/고양이 이미지분류, 택시 수요량 예측
  • 정해진 metric으로 모델을 평가
    ex. RMSE, MSE, MAE, Accuracy
  • 하나의 Experiment는 여러 Run(실행)을 가짐
  • Experiment 생성

mlflow experiments create --experiment-name my-first-expriment

  • ls -al: 전체파일의 퍼미션, 소유자, 만든날짜, 용량까지 출력
  • mlruns: 실험의 run에 대한 정보를 담는 디렉토리
  • mlflow experiments list: experiments list 출력
  • pip install numpy sklearn: 필요 라이브러리 설치
  • mkdir logistic_regression: 폴더 생성
  • touch train.py, code train.py: py생성
  • mlflow 로깅, 현재는 Auto-logging이 된다고 하는 듯?

MLflow 프로젝트

  • 프로젝트 메타 정보 저장
  • 어떤 환경에서 어떻게 실행시킬지 정의
  • 패키지 모듈의 상단에 위치

MLProject 생성

Run

: 하나의 Run은 코드를 1번 실행한 것을 의미
: 보통 Run은 모델 학습 코드를 실행
: 한번의 코드 실행 = 하나의 Run 생성
: Run을 하면 여러가지 내용이 기록됨

mlflow run logistic_regression --experiment-name my-first-experiment --no-conda

: logistic_regression 디렉토리 안에 있는 MLProject를 읽고 python train.py를 실행

UI 실행

  • mlflow ui 입력 후 출력된 local host로 접속

Autolog

  • 3줄 추가
mlflow.sklearn.autolog()
with mlflow.start_run() as run:
	lr.fit(X, y)
  • 주의사항

    • 모든 프레임워크에서 사용가능한 것은 아님
    • 지원 라이브러리

Parameter

  • train_parameter.py
  • MLProject
  • run
mlflow run logistic_regression_parameter -P solver="saga" -P penalty="elasticnet" -P l1_ratio=0.01 --experiment-name my-first-experiment --no-conda

-P "파라미터이름"="파라미터값"으로 파라미터 변경

Hyper Parameter tuning

  • GridSearch와 같이 autolog를 사용할 수 있음

MLflow 서버로 배포하기

MLflow Architecture

  • 파이썬 코드(with MLflow package)
    : 모델을 만들고 학습하는 코드, mlflow run으로 실행
  • Tracking Server
    : 파이썬 코드가 실행되는 동안 parameter, metric, model 등의 메타정보를 파일, DB에 저장
  • Artifact Store
    : 파이썬코드가 실행되는 동안 Model File, Image 등의 아티팩트를 파일, 스토리지에 저장

  • MLflow Tracking Server와 외부 Storage 사용하기

    : mlflow server 명령어로 Backend Stored URI 지정
    mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root $(pwd)/artifacts
    : 환경변수 지정 후 run해야 결과확인가능
    export MLFLOW_TRACKING_URO="http://127.0.0.1:5000"


Special Mission

  1. 개인의 Local에 MLflow 환경 설정(pip install)
  2. 개인의 Local에 MLflow 환경 설정(Docker)
  3. 팀에서 공통적으로 사용할 MLflow Tracking Server GCP에 배포하기
profile
인공지능 꿈나무

0개의 댓글