19장. MLOps 와 LLMOps, 워크플로 자동화
모델 레지스트리
주방에서는 시제품을 여럿 만들지만, 손님이 보는 메뉴판에는 고른 것만 올라갑니다. 메뉴판에는 "오늘의 추천" 같은 표시가 붙고, 반응이 나쁘면 표시를 어제 메뉴로 옮깁니다. 모델 레지스트리가 메뉴판이고, 별칭이 "오늘의 추천" 표시입니다.
1번에서 실행이 만든 모델을 이름 하나(inquiry-clf)로 등록합니다. 2번에서 등록할 때마다 버전 1, 2, 3 이 붙습니다. 3번에서 쓸 버전에 champion 별칭을 붙입니다. 4번에서 서비스는 버전 번호가 아니라 models:/inquiry-clf@champion 으로 부릅니다. 그래서 별칭만 옮기면 서비스 코드를 고치지 않고 모델이 바뀝니다.
버전과 별칭
| 버전 | 별칭 | |
|---|---|---|
| 붙는 법 | 등록할 때마다 저절로 1씩 는다 | 사람이나 파이프라인이 붙인다 |
| 바뀌나 | 한 번 붙으면 그대로 | 다른 버전으로 옮길 수 있다 |
| 쓰는 곳 | 기록, 견주기 | 서비스가 불러올 때 |
| 예 | 1, 2, 3 | champion, challenger, previous |
별칭을 옮기고 되돌리기
레지스트리의 일은 사전 하나로 흉내 낼 수 있습니다. 배포는 별칭 옮기기, 되돌리기는 앞 별칭으로 다시 옮기기입니다.
registry = {"versions": {1: "C0.3, 문의 200개", 2: "C0.3, 문의 240개"}, "aliases": {"champion": 1}}
def promote(reg, version):
"""새 버전을 챔피언으로 올리고, 앞 챔피언은 previous 로 남긴다"""
reg["aliases"]["previous"] = reg["aliases"]["champion"]
reg["aliases"]["champion"] = version
def rollback(reg):
"""챔피언을 앞 버전으로 되돌린다"""
reg["aliases"]["champion"] = reg["aliases"]["previous"]
promote(registry, 2)
print("올린 뒤:", registry["aliases"])
rollback(registry)
# 결과: champion 이 다시 1
print("되돌린 뒤:", registry["aliases"])코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
registry = {"versions": {…}, "aliases": {…}} | 버전 번호마다 설명을, 별칭마다 가리키는 버전 번호를 적은 사전이다 |
reg["aliases"]["previous"] = reg["aliases"]["champion"] | 옮기기 전에 지금 챔피언의 번호를 previous 에 적어 둔다 |
reg["aliases"]["champion"] = version | champion 이 새 버전을 가리키게 한다. 버전 자체는 건드리지 않는다 |
rollback(reg) | champion 을 previous 가 가리키는 번호로 되돌린다. rollback 은 "뒤로 되감기"라는 뜻이다 |
champion, previous | 별칭 이름이다. champion 은 "우승자"로 지금 쓰는 버전, previous 는 "앞의 것"이다 |
이 코드가 뜻하는 것
TV 리모컨의 "이전 채널" 단추를 떠올려 봅니다. 새 채널로 돌리면 리모컨이 앞 채널을 기억하고, 단추를 누르면 앞 채널로 돌아갑니다. 여기서 지금 채널이 champion, 기억한 앞 채널이 previous, 채널을 돌리는 일이 promote, 이전 채널 단추가 rollback 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
promote(registry, 2) | previous 에 1 을 적고 champion 을 2 로 옮긴다 | 새 채널로 돌리며 앞 채널을 기억한다 |
print("올린 뒤:", …) | {'champion': 2, 'previous': 1} 이 나온다 | 지금 2번, 앞은 1번 |
rollback(registry) | champion 을 previous 의 값 1 로 되돌린다 | 이전 채널 단추를 누른다 |
print("되돌린 뒤:", …) | {'champion': 1, 'previous': 1} 이 나온다 | 1번으로 돌아왔다 |
되돌리는 동안 버전 1 과 2 는 versions 에 그대로 있습니다. 바뀐 것은 별칭이 가리키는 번호뿐입니다. 비유와 다른 점은, 리모컨의 이전 채널 단추는 누를 때마다 두 채널을 오가지만, 이 rollback 은 previous 를 고치지 않아 되돌린 뒤 champion 과 previous 가 모두 1 을 가리킨다는 것입니다.
주의할 점
- 버전을 지우지 않습니다. 되돌리려면 앞 버전이 남아 있어야 합니다.
- 별칭을 옮기면 그 별칭으로 부르는 모든 서비스가 바뀝니다. 옮기기 전에 게이트를 거칩니다(마지막 절).