19장. MLOps 와 LLMOps, 워크플로 자동화
MLOps 란 무엇인가
레시피를 처음 만드는 일과, 매일 아침 여러 매장에서 같은 맛을 내는 일은 다릅니다. 처음에는 요리사 한 사람의 솜씨로 충분합니다. 매일 같은 맛을 내려면 재료가 바뀌어도 맛을 확인하는 법, 레시피를 바꾸는 절차, 맛이 변하면 알아채는 방법이 있어야 합니다.
그림은 모델의 한살이입니다. 1번에서 5번까지 가면 끝이 아니라, 5번 지켜보기에서 찾은 문제가 다시 1번으로 돌아갑니다. 여기서 레시피 만들기가 학습, 매장에 내기가 배포, 손님 반응 살피기가 지켜보기입니다. 식당과 다른 점은, 모델은 코드를 한 줄도 바꾸지 않아도 데이터가 바뀌면 결과가 달라진다는 것입니다.
노트북에서 서비스로
| 노트북의 실험 | MLOps 로 굴리는 서비스 | |
|---|---|---|
| 데이터 | 한 번 받은 파일 | 날마다 새로 들어온다 |
| 학습 | 손으로 셀을 돌린다 | 정해진 순서로 자동으로 돈다 |
| 기록 | 셀 출력에 남는다 | 실행마다 설정과 점수를 남긴다 |
| 배포 | 파일을 복사한다 | 레지스트리의 버전을 별칭으로 가리킨다 |
| 문제가 생기면 | 다시 돌려 본다 | 앞 버전으로 되돌리고 원인을 찾는다 |
무엇이 바뀌었는지 적어 두기
모델의 결과는 코드, 데이터, 설정이 함께 정합니다. 셋의 지문을 적어 두면 무엇이 바뀌었는지 바로 압니다.
import hashlib
def fp(text):
"""내용의 지문. 한 글자만 바뀌어도 달라진다"""
return hashlib.sha256(text.encode("utf-8")).hexdigest()[:8]
# 지난주와 이번 주의 학습 재료(예시 글)
last = {"코드": fp("train.py 1판"), "데이터": fp("문의 200개"), "설정": fp("C=1")}
this = {"코드": fp("train.py 1판"), "데이터": fp("문의 240개"), "설정": fp("C=1")}
# 결과: 지문이 달라진 재료만 나온다
print("바뀐 것:", [k for k in last if last[k] != this[k]])코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
hashlib | hash(해시, 잘게 다져 섞는다는 뜻)를 만드는 파이썬 표준 모듈이다. 따로 설치하지 않는다 |
hashlib.sha256(…) | SHA-256(Secure Hash Algorithm 256, 256비트 보안 해시 알고리즘)으로 내용의 지문을 만든다 |
text.encode("utf-8") | 글자를 UTF-8(Unicode Transformation Format 8-bit) 방식의 바이트로 바꾼다. 해시는 글자가 아니라 바이트를 받는다 |
.hexdigest() | 지문을 16진수(hexadecimal) 글자 64개로 돌려준다 |
[:8] | 앞 8글자만 쓴다. 눈으로 견주기 쉽게 줄인 것이다 |
[k for k in last if last[k] != this[k]] | 지난주와 이번 주의 지문이 다른 재료 이름만 모은다 |
이 코드가 뜻하는 것
지난주와 이번 주의 장보기 목록을 나란히 놓고 줄마다 대조한다고 해 봅니다. 줄마다 짧은 암호를 붙여 두면 암호만 봐도 어느 줄이 달라졌는지 압니다. 여기서 목록의 세 줄이 코드, 데이터, 설정이고, 줄마다 붙인 암호가 지문입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
fp("train.py 1판") | 글 하나를 8글자 지문으로 바꾼다 | 목록 한 줄에 암호를 붙인다 |
last = {…} | 지난주 재료 셋의 지문을 모은다 | 지난주 장보기 목록 |
this = {…} | 이번 주 지문을 모은다. 데이터만 "문의 240개"로 다르다 | 이번 주 장보기 목록 |
print("바뀐 것:", […]) | 지문이 다른 재료만 고른다 | 암호가 다른 줄에 형광펜을 친다 |
결과 바뀐 것: ['데이터'] 는 코드와 설정은 그대로이고 데이터만 바뀌었다는 뜻입니다. 이번 주 모델이 지난주와 다르게 답한다면 데이터부터 살펴보면 됩니다. 비유와 다른 점은, 장보기 목록은 무엇이 어떻게 바뀌었는지 눈으로 보이지만 지문은 바뀌었다는 사실만 알려 준다는 것입니다.
작게 줄여서 눈으로 보기
한 글자만 다른 글과 똑같은 글의 지문을 견줘 봅니다.
import hashlib
for text in ["C=1", "C=2", "C=1"]:
print(text, hashlib.sha256(text.encode("utf-8")).hexdigest()[:8])
print(len(hashlib.sha256("C=1".encode("utf-8")).hexdigest())) # 지문 전체의 글자 수C=1 8939a6e6
C=2 4482b577
C=1 8939a6e6
64| 결과 | 읽는 법 |
|---|---|
C=1 8939a6e6 두 줄 | 같은 글은 몇 번을 넣어도 같은 지문이 나온다 |
C=2 4482b577 | 숫자 하나만 바뀌어도 지문이 통째로 달라진다. 비슷한 글이라고 지문이 비슷하지 않다 |
64 | 지문 전체는 64글자다. 본문 코드는 그 가운데 앞 8글자만 쓴다 |
주의할 점
- 코드가 그대로여도 데이터가 바뀌면 다른 모델이 됩니다. 데이터에도 판(버전)을 붙입니다.
- MLOps 는 도구 이름이 아니라 일하는 방식입니다. 작은 팀은 파이썬 스크립트와 기록 파일로 시작해도 됩니다.