19장. MLOps 와 LLMOps, 워크플로 자동화
MLOps 의 단계와 흐름
집에서 하는 요리, 동네 분식집, 프랜차이즈 본사는 같은 김밥을 만들어도 일하는 방식이 다릅니다. 집에서는 그때그때 손으로 만듭니다. 분식집은 아침 준비 순서가 정해져 있습니다. 본사는 레시피가 바뀌면 시식과 교육을 거쳐 모든 매장에 한꺼번에 내려보냅니다.
그림의 세 카드는 왼쪽에서 오른쪽으로 갈수록 사람 손이 줄어듭니다. 왼쪽은 사람이 노트북을 돌려 모델 파일을 넘깁니다. 가운데는 학습과 평가가 정해진 순서로 저절로 돕니다. 오른쪽은 코드나 데이터가 바뀌면 시험, 학습, 배포까지 이어서 돕니다. 집 요리가 첫 단계, 분식집이 둘째, 프랜차이즈 본사가 셋째입니다.
단계 견주기
| 단계 | 학습 | 배포 | 맞는 경우 |
|---|---|---|---|
| 손으로 | 사람이 노트북을 돌린다 | 파일을 복사한다 | 첫 모델, 드물게 바꾸는 모델 |
| 학습 자동화 | 일정이나 새 데이터가 오면 파이프라인이 돈다 | 사람이 확인하고 올린다 | 데이터가 자주 바뀌는 서비스 |
| 배포까지 자동화 | 파이프라인이 돈다 | 품질 게이트를 넘으면 저절로 바뀐다 | 모델이 많고 자주 바뀌는 곳 |
요즘의 흐름
- LLM 이 들어오며 관리할 것이 늘었습니다. 모델 가중치보다 프롬프트, 검색 색인, 평가 묶음이 더 자주 바뀝니다. 이를 LLMOps 라고 부릅니다(다음 절과 5번째 절).
- 평가가 운영의 중심이 되었습니다. 정답이 하나가 아닌 LLM 은 배포 전에 정해 둔 질문 묶음으로 재는 일이 게이트가 됩니다(20장에서 더 다룹니다).
- 오픈소스 도구를 조합합니다. 실험 기록과 레지스트리는 MLflow, 워크플로는 Airflow 나 Prefect·Dagster, 배포는 Docker 와 Kubernetes 처럼 역할마다 도구를 고릅니다.
- 사내 서버(온프레미스)에서 돌리는 수요가 있습니다. 데이터를 밖에 내보낼 수 없는 곳은 같은 도구를 사내에 설치해 씁니다(11장).
다시 학습할 때를 정하기
언제 다시 학습할지는 규칙으로 정해 둡니다. 정한 날짜, 새 데이터의 양, 성능 하락이 흔한 신호입니다.
def need_retrain(days_since, new_rows, live_acc, base_acc):
"""다시 학습해야 하는 까닭을 모두 돌려준다. 하나도 없으면 빈 목록"""
reasons = []
if days_since >= 7:
reasons.append("일주일이 지났다")
if new_rows >= 40:
reasons.append("새 데이터가 40개 넘게 모였다")
if live_acc < base_acc - 0.05:
reasons.append("운영 정확도가 0.05 넘게 떨어졌다")
return reasons
# 결과: 사흘째, 새 문의 45개, 정확도는 그대로인 경우
print(need_retrain(3, 45, 0.84, 0.85))코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
days_since | 지난 학습 뒤 며칠이 지났는지(days since)다 |
new_rows | 새로 모인 데이터의 줄(row) 수다 |
live_acc, base_acc | 운영 중(live)에 잰 정확도와 배포할 때 잰 기준(base) 정확도다. acc 는 accuracy(정확도)의 줄임말이다 |
reasons.append(…) | 까닭을 하나씩 목록에 더한다. 여러 까닭이 한꺼번에 맞을 수 있어 if 를 따로따로 쓴다 |
live_acc < base_acc - 0.05 | 운영 정확도가 기준보다 0.05 넘게 낮으면 참이다 |
이 코드가 뜻하는 것
자동차 엔진오일을 떠올려 봅니다. 바꾼 지 오래되었거나, 많이 달렸거나, 경고등이 켜지면 바꿉니다. 셋 가운데 하나만 맞아도 정비소에 갑니다. 여기서 지난 기간이 days_since, 달린 거리가 new_rows, 경고등이 정확도 하락입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
if days_since >= 7 | 일주일이 지났는지 본다 | 바꾼 지 오래되었나 |
if new_rows >= 40 | 새 데이터가 40개 이상인지 본다 | 많이 달렸나 |
if live_acc < base_acc - 0.05 | 정확도가 많이 떨어졌는지 본다 | 경고등이 켜졌나 |
need_retrain(3, 45, 0.84, 0.85) | 사흘, 새 문의 45개, 정확도 0.01 하락을 넣는다 | 기간은 남았고 경고등도 꺼져 있지만 많이 달렸다 |
결과는 까닭 하나 ['새 데이터가 40개 넘게 모였다'] 입니다. 빈 목록이 아니므로 다시 학습할 때입니다. >= 는 "같거나 크다"라서, 새 데이터가 정확히 40개일 때도 이 까닭이 들어갑니다. 비유와 다른 점은, 엔진오일은 바꾸면 끝이지만 모델은 다시 학습한 뒤 게이트를 넘어야 실제로 바뀐다는 것입니다(마지막 절).
주의할 점
- 처음부터 셋째 단계를 만들 필요는 없습니다. 같은 일을 세 번 손으로 했다면 자동화할 때입니다.
- 자동으로 배포하는 단계에서는 게이트가 사람의 확인을 대신합니다. 게이트가 허술하면 나쁜 모델도 저절로 나갑니다.