daniel7481의 개발일지

AI 서비스 개발 기초 본문

AI Tech 4기/Level1

AI 서비스 개발 기초

daniel7481 2022. 11. 7. 17:06
반응형

AI 서비스 개발

이제 머신러닝 모델에 대해 공부를 했으니 ai 서비스를 개발하는 법을 배우는 시간이다. 나중에 product serving에 대해 자세히 공부하기 전에 간단하게 1주 동안 강의를 듣고, 변성윤 마스터님께서 내준 추가 학습 문제를 정리해보려고 한다.

MLOps가 필요한 이유 이해하기

정적으로 주어진 데이터셋만 가지고 학습을 한 모델은 research 용도로만 사용이 되고, 실제로 딥러닝 모델을 상품화 하려면 데이터를 끊임없이 feeding 해주고 모델을 업데이트 해주는 과정이 필요하다. 오래된 데이터로 학습된 데이터는 시간이 갈수록 decay되고, 좋은 성능을 내기 어렵다. 데이터를 모으고, 데이터 품질을 확인하고, 모델에 자동으로 학습이 되고 사용자가 request할 때 모델에서 나온 output을 respond 해주는 과정을 자동화 해주기 위해 MLOps가 필요하다.

 

MLOps의 각 Component에 대해 이해하기(왜 이런 Component가 생겼는가?)

Server 인프라

로컬 GPU에서 학습을 하면 별도의 인프라가 필요하지 않지만, 회사 차원에서 모델을 학습시키고 서비스 유지를 하려면 서버가 필요하다. 또한 서버의 CPU, Memory 성능을 회사의 예산 내에서 설정을 해야 하고, 자체 서버를 구축하거나 클라우드 서비스를 통해 구축할 수 있겠다. GPU를 자체적으로 구매하여 사용하기에 부담이 되면 클라우드 GPU를 사용할 수 있겠다. 

Serving

Batch serving: 주기적으로 모델이 예측한 값을 반환하여 serving하는 방식

- 여러 가지 데이터가 한꺼번에 처리되는 경우

- 1시간/하루 등 주기적으로 예측해도 괜찮은 경우

Online serving: 실시간으로 input을 넣으면 output을 예측하는 방식

- 데이터 하나씩 요청하는 경우

- API 형태로 바로 결과를 반환해야 하는 경우

- 서버와 통신이 필요한 경우

Experiment, Model Management

모델 Artifact 등을 저장하고, 다양한 모델에 대하여 모델 생성일, 모델 성능, 모델의 메타 정보(Hyperparams, Statistics, Evaluation metrics, schemas, models, profiling logs)등을 저장하고 관리하는 부분이다. 대표적으로 mlflow를 사용할 수 있다.

Feature Store

데이터에 대한 피처들을 저장하여 별도의 전처리 과정을 생략할 수 있는 과정

Data Validation

입력으로 들어오는 데이터가 학습에 사용되었던 데이터와 유사한지를 확인해야 하고, 데이터의 품질 또한 평가를 하는 부분이다. Training과 serving 데이터간의 분포 차이를 확인할 수 있고, 지속적인 학습으로 시간이 지남에 따라 모델의 성능이 떨어지는 Model drift를 방지할 수 있다. AWS Deequ로 데이터의 quality를 측정할 수 있다.

Continuous Training

모델에 학습된 데이터가 오래될수록 모델의 성능은 내려갈 수 있다. 이런 상황을 방지하기 위해 retrain해야 하는데, 새로운 데이터가 들어오는 경우, 매일, Metric을 기반으로 성능이 떨어졌을 때 아님 요청 시에 retrain을 할 수 있다.

Monitoring

모델의 지표, 인프라 성능 지표를 잘 기록하여 학습이 잘 진행되고 있는지, 올바른 출력이 나오고 있는지 확인 할 필요가 있다. Log로 남긴 다음 주기적으로 확인하는 과정이다.

AutoML

위 과정을 자동으로 진행해주는 부분이다.

MLOps Component 중 내가 매력적으로 생각하는 TOP3을 정해보고 왜 그렇게 생각했는지 작성해보기

Data Validation

학습 과정에서 잘 동작하는 모델이 실제 product에서는 잘 동작하지 않을 수 있다. 여러 가지 요소가 있지만 이런 경우에는 모델을 개발하는 아무 의미가 없을 수도 있다. 이러한 문제 발생 시에는 input data가 문제가 있을 경우가 많으니, 이를 관리하는 부분이 중요한 것 같다.

Continuous Training

추천 시스템을 예로 들면 오래된 데이터는 현재 사용자의 추천 란에 전혀 도움이 안된다. 오히려 예측에 방해가 될 가능성이 높다. 이런 결과를 방지 하기 위해 모델을 꾸준히 학습시키는 과정이 필요하다. 시대에 뒤떨어진 모델은 독이기에, 매력적인 기능인 것 같다.

AutoML

위 component 전부 정말 중요하지만, AutoML이 가장 중요한 것 같다. 어느 순간이 되면 모든 과정이 자동화되어야 한다. 인력과 자원을 낭비하기 위해 MLOps가 우리가 해야 할 일을 대신 해줘야 하는데, AutoML을 통해 자동으로 데이터 feeding, training, update를 해준다니 너무나 매력적인 요소인 것 같다.

 

Linux_Shell Command

Shell

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

터미널

- 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달

- 프로그램의 출력을 화면에 작성

기본 쉘 커맨드

mkdir - 폴더 생성하기

ls - 현재 접근한 폴더의 폴더와 파일 확인

    -a: .으로 시작하는 파일, 폴더를 포함한 전체 파일 출력

    -l: 퍼미션, 소유자, 만든 날짜, 용량까지 출력

    -h: 용량을 사람이 읽시 쉽도록 표현, -l과 같이 사용

pwd - 현재 폴더 절대경로로 보여줌

cd - 폴더 변경하기

echo - python의 print, 터미널에 텍스트 출력

vi - 편집기로 파일 생성

    - INSERT 모드에서만 수정 가능

    - ESC, :wq 저장하고 나가기, q: 그냥 나가기, wq! 강제로 저장하고 나오기, w: 저장하기

bash - 쉘 스크립트 실행 ex: bash test.sh

sudo - 관리자 권한으로 실행하고 싶은 경우 사용(사용에 주의! 너무 많은 권한을 주는 셈)

cp - 파일 또는 폴더 복사하기 ex) cp test.sh test2.sh -> test.sh 내용이 test2.sh로 복사

     -r: 디렉토리 복사할 때 안에 파일까지 재귀적으로 복사

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

mv - 파일, 폴더 이동하기

cat - 특정 파일 내용 출력

clear - 터미널 창 꺠끗하게 지우기

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

      - !n으로 n번째 커맨드 다시 사용가능

find - 파일 및 디렉토리 검색할 때 사용 ex) find .-name "FILE" == 현재 폴더에서 FILE이란 이름 가지느 폴더/디렉토리 검색

export - 환경 변수 설정 ex) export water="물" -> echo $water = 물

      - 터미널이 꺼지면 사라지게 된다

※리눅스 환경에서는 = 양 끝에 공백이 있으면 안된다! water = "물" -> 에러

alias - 현재 별칭으로 설정된 것 확인 가능

         - alias ll2='ls -1' 설정해주면 ll2로 ls -l 사용가능

쉘 커맨드

head, tail - 앞/뒤 n행 출력 ex) head -n 3 vi-test.sh

sort - 행 단위 정렬

       -r : 정렬을 내림차로 정렬(deafult는 오름차순)

       -n : Numeric Sort

       - ex) cat fruits.txt | sort

uniq - 중복된 행이 있으면 중복 제거

grep - 파일에 주어진 패턴 목록과 매칭되는 라인 검색

         -i : 대소문자 구분 없이

         -w : 정확히 그 단어만 찾기

         -v : 특정 패턴 제외한 결과 출력

         -E : 정규 표현식 사용

cut - 파일에서 특정 필드 추출

      -f: 잘라낼 필드 지정

      -d: 필드를 구분하는 구분자

      - ex) cat cut_file | cut -d : -f 1, 7 == 1번쨰, 7번째 가져옴

Stream - Unix에서 동작하는 프로그램은 커맨드 실행 시 3개의 Stream 생성

             - stdin: 0으로 표현, 입력

              -stdout: 1로 표현, 출력 값

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

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

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

                   - >>: 맨 아래에 추가(append)

Pipe( | ) - 프로그램의 출력을 다른 프로그램의 입력으로 사용하고 싶은 경우

              - A | B == A의 output을 B의 input으로 사용

             - ex) ls | grep "vi" == ls로 나온 파일명 중 vi가 포함된 단어

ps - 현재 실행되고 있는 프로세스 출력

     -e: 모든 프로세스

     -f: full format으로 자세히 보여줌

curl - Command Line 기반의 Data Transfer 커맨드, Request를 테스트할 수 있는 명렁어

df - 현재 사용 중인 디스크 용량 확인

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

scp - ssh를 이용해 네트워크로 연결된 호스트 간 파일 주고 받기

       -r: 재귀적으로 복사

       -P: ssh 포트 지정

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

       - local => remote : scp loca_path user@ip:remote_directory

       - remote => local : scp user@ip:remote_directory local_path

       - remote => remote: scp user@ip:remote_directory user2@ip2:target_remote_directory

nohup - Permission이 755인 파일을 터미널 종료 후에도 백그라운드에서 실행하게 해줌

           - ex) nohup python3 app.py &

chmod - 파일의 권한을 변경

            - r(읽기) = 4, w(쓰기) = 2, x(실행하기) = 1, -=denied

            - r-x 읽거나 실행할 수는 있지만 w가 없으므로 수정 불가능

            - 셋을 더하면 7, 755 or 644로 퍼미션 주세요!라고 하면 더한 형태로 퍼미션 줌

 

반응형

'AI Tech 4기 > Level1' 카테고리의 다른 글

20221014 4주차 금요일 회고  (0) 2022.10.19
20221013 4주차 목요일 회고  (0) 2022.10.19
20221012 4주차 수요일 회고  (0) 2022.10.12
20221011 4주차 화요일 회고  (0) 2022.10.12
20221007 3주차 금요일  (1) 2022.10.07