부스트캠프 8주차

TAEJUN YOUN·2022년 11월 11일
0

MLOps개론

모델 개발 프로세스

문제정의, EDA, feature engineering, train, result
-> 이러한 프로세스는 고정된 데이터를 사용함(보통 research)

결국 사용하기 위해 우리는 모델을 production 환경에 맞춰 배포해야함

배포시 문제

  1. 모델의 성능이 계속 변경
  2. 새로운 모델이 더 안좋음
  3. 모델의 결과값이 이상한 경우 존재

MLOps란?

머신러닝 모델 개발과 머신러닝 모델 운영에서 사용되는 문제, 반복을 최소화해 비즈니스 가치를 창출해내는 것이 목표
-> 옛날에 산업혁명 생각해보면 이해가 쉬울듯(결국 프로세스 개선)

MLOps의 요소

serving

batch serving: 많은 데이터를 일정 주기로 한번에 예측(jupyter notebook)
online serving: 실시간 예측, 동시에 많은 요청이 들어오는 경우 확장 가능하도록 준비

Experiment, Model Management

기록을 해야지 어떤 조합이 좋은지 알 수 있음

Feature store

모델을 만들때 feature에서 다 가져옴, 언제든 가져다 쓸 수 있도록 저장

Data valiation

이전에 사용했던 데이터와 비슷한지 확인할 필요가 있음(Data drift)

Continuos training

데이터를 새로받았을 때, 일정기간, 성능이 낮아진경우 training을 해야함

Monitoring

AutoML

Model Serving

serving이란?
production 환경에 모델을 사용할 수 있도록 배포하는 것
머신러닝 모델을 개발하고, 현실 세계에서 사용할 수 있도록 만드는 행위

Batch Serving

주기적으로 학습하는 경우 사용
특정 시간에 반복해서 실행
장점: online serving보다 구현이 수월하다. latency문제 없다.
단점: 실시간 활용이 안된다. 새로생긴 데이터를 바로 사용할 수 없다

Online Serving

요청이 올대마다 실시간 예측
serving할 때 dependency가 굉장히 중요함
재현가능하지 않은 코드는 risk를 가진다.
실시간 예측이므로 지연시간을 최소화해야한다.

머신러닝 프로젝트 라이프 사이클

문제정의의 중요성

문제정의: 특정 현상을 파악하고, 그 현상에 있는 문제를 정의하는 과정! 문제정의는 본질을 파악하는 과정임

Flow
1. 현상파악: 어떤 현상이 발견되었는가?
2. 문제정의: 현상을 더 구체적으로 명확한 용어로 정리
3. 프로젝트 설계: 문제 정의에 기반해서 프로젝트 설계
4. action: 모델 개발 후 배포
5. 추가원인 분석

Linux & Shell Command

Linux

Linux

개발 전에는 mac os 나 window os,

하지만 프로그래밍 하면 리눅스를 다룰 일이 많음..

Linux를 알아야 하는 이유

서버에서 자주 사용하는 os

무료라서 많이 씀

안정성, 신뢰성, 유닉스라 stability, reliability

쉘 커맨드, 쉘 스크립트

CLI, GUI

CLI(command line interface): terminal 환경

GUI(graphic user interface): 우리가 보통 쓰는 환경

대표적인 Linux배포판

debian

ubuntu: 초보자들이 쉽게 접근할 수 있도록 만듬

redhat

centos: redhat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전

Linux, Shell Script 학습 가이드

최초에 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습

필요한 코드가 있는 경우 검색해서 찾기

해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기

배경지식이 필요한 경우 linux, os학습

****리눅스를 사용하는 방법****

virtualbox에 linux 설치, 도커로 설치

wsl사용

notebook에서 터미널 실행

cloud에서 띄우는 인스턴스에서 연습

Shell Command

쉘의 종류

쉘: 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램

터미널/콘솔: 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달, 프로그램의 출력을 화면에 작성

sh: 최초의 쉘

bash:리눅스 표줄 쉘

zsh: mac 카탈리나 표준 쉘

쉘을 사용하는 경우

서버에서 접속해서 사용하는 경우

리눅스의 내장 기능을 활용하는 경우

데이터 전처리를 하기위해 쉘 커맨드를 사용

도커를 사용하는 경우

수백대의 서버를 관리할 경우

주피터 노트북의 cell앞에 !를 붙이면 쉘 커맨드가 사용됨

터미널에서 python3, jupyter notebook도 쉘 커맨드

test code실행

배포 파이프라인 실행(github action등에서 실행)

기본 쉘 커맨드

man

vi

echo

ls

pwd

cd

mkdir

bash

sudo

관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo를 붙임

sudo명령어는 최고 권한을 가진 슈퍼유저로 프로그램을 실행

cp

파일 또는 폴더 복사하기

-r: 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 recursive(재귀적)으로 모두 복사

-f: 복사할 때 강제로 실행

mv: 파일 폴더 이동하기

cat: 특정 파일 내용 출력

clear: 터미널창 깔끔하게 지워줌

history: 최근에 입력한 쉘 커맨드 history 출력

find: 파일 및 디렉토리 검색할 때 사용

export : 환경변수 설정

export water=’물’

echo $water

export로 환경변수 설정한 경우, 터미널이 꺼지면 사라지게 된다.

vi /.bashrc또는 vi/.zshrc에다가 저장하면 됨

그 후 source ~/.zshrc

리눅스 환경 설정을 재로그인 하지 않고 즉시 적용하고 싶은 경우 source 사용

alias: 별칭, 기본 명령어를 간단히 줄일 수 있음

표준 스트림

stdin: 0으로 표현, 입력(비밀번호, 커맨드 등)

stdout: 1로 표현, 출력값(터미널에서 나오는 값)

stderr: 2로 표현, 디버깅 정보나 에러 출력

Redirection & Pipe(중요!!)

redirection: 프로그램의 출력을 다른 파일이나 스트림으로 전달

>: 덮어쓰기 파일이 없으면 생성하고 저장

>>: 맨 아래에 추가하기

echo ‘hi’ > vi-test3.sh

echo ‘hello’ >> vi-test3.sh

cat vi-test3.sh

pipe: 프로그램의 출력을 다른 프로그램의 입력으로 사용하고 싶은 경우

A의 output을 B의 input으로 사용

현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우

ls | grep ‘vi’

grep ‘vi’: 특정 단어 찾기

ls | grep ‘vi’

위 결과를 output.txt에 저장하고싶은 경우

ls | grep ‘vi’ > output.txt

서버에서 자주 사용하는 쉘 커맨드

PS: 현재 실행되고 있는 프로세스 출력하기

-e: 모든 프로세스

-f: Full Format으로 자세히 보여줌

curl: request를 테스트할 수 있는 명령어

웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음

DF: 현재 사용 중인 디스크 용량 확인

-h: 사람이 읽기 쉬운 형태로 출력

scp: ssh를 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어

-r: 재귀적으로 복사

-P: ssh 포트 지정

-i: ssh 설정을 활용해 실행

Docker

도커 소개

가상화란?

개발을 진행한 local환경과 Production 서버 환경이 다른 경우

local 환경은 윈도우

서버 환경은 linux

os가 다르기 때문에 라이브러리, 파이썬 등을 설치할 때 다르게 진행해야함

local 환경과 서버가 같은 os를 사용해도, 서버에서 올바르게 작동하지 않을 수 있음

이전: readme에 기록하고 항상 실행하도록 하는 방법 → 에러도나고 번거로움

가상화?: research/production 환경에서 공통적으로 사용하는 일종의 템플릿

특정 소프트웨어 환경을 만들고 local, production 서버에서 그대로 활용

개발과 운영 서버의 환경 불일치가 해소

어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있음

개발 외에 research도 동일한 환경을 사용할 수 있음

docker 등장하기 전

VM을 사용 os위에 os를 올리는 거

→ VM은 굉장히 리소스를 많이 사용

Container: VM의 무거움을 크게 덜어주어 가볍고 빠르게 가상화를 구현할 수 있음

container기술을 쉽게 사용할 수 있도록 나온 도구가 바로 도커

Docker Image

컨테이너를 실행할 때 사용할 수 있는 템플릿

read only

Docker Container

Docker Image를 활용해 실행된 인스턴스

write가능

docker로 할 수 있는 일

다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있음

ex) mysql을 docker로 실행, jupyter notebook을 docker로 실행

다른사람이 만든 소프트웨어: docker image

어느 환경에서도 동일하게 실행할 수 있음

자신만의 이미지를 만들면 다른사람에게 공유할 수 있음

원격 저장소에 저장하면 어디서든 사용할 수 있음

원격저장소: container registry

MLflow

MLflow개념잡기

MLflow란

없었을때:

각자 코드를 jupyter notebook에서 작성함, 머신러닝 모델 학습시 사용한 parameter, metric을 따로 기록

다른 동료들에게 weight file을 저장해 다른 동료들에게 공유

weight file이름으로 model versioning을 하거나 versioning을 하지 않음

문제:

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

MLflow:

머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스

관련 오픈소스 중 제일 빠르게 성장 중

CLI, GUI지원

핵심기능: 레시피를 기억, 실험들도 기업, 제일 좋았던 것을 찾을 수 있음, 언제 생겼고 언제 만들었느닞도 알 수 있음, 여러 모델을 운영함

  1. 실험들을 관리하고 기록할 수 있음
  2. 모델 저장소에 모델을 저장할 수 있음, 해당 모델의 버전이 자동으로 올라감, 모델을 쉽게 공유 가능함
  3. model serving: model registry에 등록한 모델을 rest api형태로 서버로 serving할 수 있음, 직접 도커이미지 만들지 않아도 됨

MLflow Components

  1. MLflow Tracking: 머신러닝 코드 실행, 로깅을 위한 api, ui제공하며 결과를 여러 실행과 비교할 수 있음
  2. MLflow project: 머신러닝 프로젝트 코드를 패키징하기 위한 표준,
  3. MLflow model: 모델은 모델 파일과 코드로 저장됨
  4. MLflow Registry: MLflow model의 전체 Lifecycle에서 사용할 수 있는 중앙 모델 저장소

참고: 부스트캠프 AITech 4기 변성윤 마스터님 강의

profile
Study and Share

0개의 댓글