[부스트캠프 AI tech AI서비스개발기초] week05 (2022.02.17)
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
커맨드가 동작하는지 확인
mysql 8버전 이미지를 다운
docker pull '이미지이름':'태그'
다운받은 이미지 확인
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(link)
: 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
- 개인의 Local에 MLflow 환경 설정(pip install)
- 개인의 Local에 MLflow 환경 설정(Docker)
- 팀에서 공통적으로 사용할 MLflow Tracking Server GCP에 배포하기
Author And Source
이 문제에 관하여([부스트캠프 AI tech AI서비스개발기초] week05 (2022.02.17)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@redgreen/부스트캠프-AI-tech-AI서비스개발기초-week05-2022.02.17저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)