Model Registry
모델 레지스트리는 학습된 모델과 메타데이터를 버전별로 관리하는 카탈로그로, 승인된 버전과 프로덕션에서 제공 중인 버전을 기록합니다.
모델 레지스트리는 학습된 머신러닝 모델을 버전별로 관리하는 카탈로그입니다. 각 항목에는 모델 가중치 파일과 같은 모델 아티팩트와 함께 모델을 신뢰하는 데 필요한 메타데이터가 저장됩니다. 여기에는 모델을 만든 학습 실행, 데이터 버전, 평균 정밀도(mAP)와 같은 평가 지표, 입력 및 출력 스키마, 소유자, 승인 상태가 포함됩니다. 배포 파이프라인과 애플리케이션은 가중치 파일을 주고받는 대신 이름이 지정된 버전이나 현재 프로덕션 레이블이 지정된 버전을 레지스트리에 요청하므로, 모든 릴리스와 롤백은 정확히 기록된 모델을 가리킵니다. 머신러닝 운영(MLOps)에서 레지스트리는 실험 추적과 모델 배포 사이에 위치합니다. 널리 사용되는 레지스트리로는 MLflow Model Registry, Amazon SageMaker Model Registry, Vertex AI Model Registry, Weights & Biases Registry가 있습니다.
모델 레지스트리의 작동 방식#
등록된 모델은 defect-detector과 같은 이름으로, 일련의 버전을 관리합니다. 등록된 각 버전은 변경할 수 없으므로 새 가중치는 항상 새 버전이 되며, 버전 7은 언제나 동일한 바이트를 의미합니다. 일반적으로 버전에는 다음 정보가 기록됩니다.
- 계보: 모델을 생성한 실행 ID, 코드 커밋, 데이터셋 버전, 상위 모델입니다.
- 평가 결과: 검증 지표와 각 대상 장치에서 측정한 지연 시간 및 메모리입니다.
- 시그니처: 예상 입력 및 출력 스키마로, 호출자가 잘못된 형상을 전달하면 즉시 오류가 발생합니다.
- 모델 카드: 의도된 사용 방식, 학습 데이터, 알려진 한계에 관한 문서입니다.
- 상태: 버전의 상태를 표시하는 태그와 별칭입니다.
Ultralytics Platform은 호스팅하는 모든 YOLO 학습 실행에 대해 이러한 기록을 유지합니다. 모델 페이지에는 상위 모델, 고정된 데이터셋 버전, Git 커밋, ultralytics 버전, 하이퍼파라미터, 최종 지표, 재현 가능한 yolo train 명령이 표시되며, 사용자 지정 메타데이터 필드에는 릴리스 추적이나 거버넌스를 위한 JSON 객체를 입력할 수 있습니다.
이전 레지스트리는 각 버전을 Staging, Production, Archived와 같은 고정 단계로 이동시켰습니다. MLflow는 버전 2.9.0에서 단계를 더 이상 사용하지 않고 별칭을 도입했습니다. 별칭은 @champion과 같이 팀이 버전 간에 이동할 수 있는 변경 가능한 이름 지정 포인터입니다. Amazon SageMaker는 각 버전의 승인 상태를 PendingManualApproval, Approved 또는 Rejected로 추적합니다. 모델 승격은 별칭을 이동하는 것이며, 롤백은 별칭을 이전 버전으로 되돌리는 것입니다.
레지스트리는 변경 권한도 관리합니다. 데이터 과학자는 버전을 등록하고, 지정된 검토자는 프로덕션 별칭을 이동하며, 모든 변경 사항은 감사 로그에 기록됩니다. 팀은 이러한 이벤트를 자동화에 연결하는 경우가 많습니다. 버전 승인 시 배포 파이프라인을 시작하고, 데이터 드리프트에 대한 모델 모니터링 경고가 발생하면 다음 후보 버전을 등록하는 재학습을 시작합니다.
MLflow 레지스트리는 몇 줄의 코드로 이러한 패턴을 보여줍니다. 이 스크립트는 작은 scikit-learn 분류기를 학습하고 등록한 다음, 새 버전을 가리키도록 champion 별칭을 설정하고, 모델 서빙 코드가 현재 프로덕션 모델을 찾는 방식처럼 별칭을 통해 모델을 불러옵니다.
import mlflow
from mlflow import MlflowClient
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# Keep runs and registered model versions in a local SQLite file
mlflow.set_tracking_uri("sqlite:///mlflow.db")
X, y = load_iris(return_X_y=True)
# Log a trained model inside a run, then register it as a new version
with mlflow.start_run():
model = LogisticRegression(max_iter=200).fit(X, y)
info = mlflow.sklearn.log_model(model, name="model")
version = mlflow.register_model(info.model_uri, "iris-classifier")
# Point the "champion" alias at this version; applications load the alias
MlflowClient().set_registered_model_alias("iris-classifier", "champion", version.version)
champion = mlflow.pyfunc.load_model("models:/iris-classifier@champion")
print(f"version {version.version}:", champion.predict(X[:3]))새 데이터베이스에서 스크립트를 실행하면 등록된 버전과 처음 세 꽃의 예측 클래스인 version 1: [0 0 0]이 출력됩니다. 다시 실행하면 버전 2가 등록되고, 동일한 models:/iris-classifier@champion URI가 별칭을 따라 새 버전으로 이동하므로 모델 로딩 코드는 바꾸지 않아도 됩니다.
모델 레지스트리와 관련 도구 비교#
- 실험 추적: 사용되지 않는 실행까지 포함해 모든 학습 실행을 기록합니다. 레지스트리는 배포할 가치가 있는 소수의 후보를 관리하고 각 버전을 해당 실행에 연결합니다.
- 객체 스토리지: Amazon S3와 같은 버킷에 파일을 보관합니다. 레지스트리는 버전, 메타데이터, 접근 제어를 추가하며, 버킷에 있는 파일의 포인터만 저장하는 경우가 많습니다.
- 피처 스토어: 모델이 사용하는 입력 피처의 버전을 관리하고 제공하며, 모델 자체는 레지스트리에 보관합니다.
- 컨테이너 레지스트리: 모델을 실행하는 Docker 이미지를 저장하므로, 배포 시 일반적으로 이미지 태그 하나와 모델 버전 하나를 지정합니다.
- Hugging Face Hub: 커밋 이력과 각 저장소 첫 페이지의 모델 카드를 갖춘 Git 저장소에 공개 및 비공개 모델을 호스팅하므로, 오픈 웨이트 모델을 위한 레지스트리 역할을 합니다.










