사용자 지정 모델 배포
이 문서에서는 Mosaic AI Model Serving를 사용하여 사용자 지정 모델을 배포하기 위한 지원을 설명합니다. 또한 지원되는 모델 로깅 옵션 및 컴퓨팅 유형, 서비스용 모델 종속성을 패키징하는 방법, 엔드포인트 만들기 및 크기 조정에 대한 세부 정보도 제공합니다.
사용자 지정 모델이란?
모델 서비스 제공은 모든 Python 모델을 프로덕션 등급 API로 배포할 수 있습니다. Databricks는 사용자 지정 모델과 같은 모델을 참조합니다. 이러한 ML 모델은 scikit-learn, XGBoost, PyTorch 및 HuggingFace 변환기와 같은 표준 ML 라이브러리를 사용하여 학습할 수 있으며 Python 코드를 포함할 수 있습니다.
사용자 지정 모델을 배포하는 방법.
- 네이티브 MLflow 기본 제공 버전 또는 pyfunc를 사용하여 MLflow 형식으로 모델 또는 코드를 기록합니다.
- 모델이 기록되면 Unity 카탈로그(권장) 또는 작업 영역 레지스트리에 등록합니다.
- 여기에서 엔드포인트를 제공하는 모델을 만들어 모델을 배포하고 쿼리할 수 있습니다.
Databricks에서 사용자 지정 모델을 제공하는 방법에 대한 전체 자습서는 모델 제공 자습서를 참조하세요.
Databricks는 또한 생성 AI 애플리케이션에 대한 생성 AI 모델 제공을 지원합니다. 지원되는 모델 및 컴퓨팅 제품에 대한 파운데이션 모델 API 및 외부 모델을 참조하세요.
Important
Anaconda를 사용하는 경우 서비스 약관 공지를 검토하여 추가 정보를 확인합니다.
ML 모델 로그
모델 제공을 위해 ML 모델을 기록하는 방법에는 여러 가지가 있습니다. 다음 목록에는 지원되는 메서드 및 예제가 요약되어 있습니다.
자동 로깅 이 메서드는 ML용 Databricks Runtime을 사용할 때 자동으로 사용하도록 설정됩니다.
import mlflow from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import load_iris iris = load_iris() model = RandomForestRegressor() model.fit(iris.data, iris.target)
MLflow의 기본 제공 버전을 사용하여 로그합니다. 보다 자세한 제어를 위해 모델을 수동으로 기록하려는 경우 이 메서드를 사용할 수 있습니다.
import mlflow from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() model = RandomForestClassifier() model.fit(iris.data, iris.target) with mlflow.start_run(): mlflow.sklearn.log_model(model, "random_forest_classifier")
pyfunc
를 사용한 사용자 지정 로깅합니다. 이 메서드를 사용하여 임의의 Python 코드 모델을 배포하거나 모델과 함께 추가 코드를 배포할 수 있습니다.import mlflow import mlflow.pyfunc class Model(mlflow.pyfunc.PythonModel): def predict(self, context, model_input): return model_input * 2 with mlflow.start_run(): mlflow.pyfunc.log_model("custom_model", python_model=Model())
HuggingFace에서 다운로드합니다. Hugging Face에서 직접 모델을 다운로드하고 해당 모델을 서비스용으로 기록할 수 있습니다. 예제는 Notebook 예제를 참조하세요.
서명 및 입력 예제
MLflow에 서명 및 입력 예제를 추가하는 것이 좋습니다. 서명은 Unity 카탈로그에 모델을 로깅하는 데 필요합니다.
다음은 서명 예제입니다.
from mlflow.models.signature import infer_signature
signature = infer_signature(training_data, model.predict(training_data))
mlflow.sklearn.log_model(model, "model", signature=signature)
다음은 입력 예제입니다.
input_example = {"feature1": 0.5, "feature2": 3}
mlflow.sklearn.log_model(model, "model", input_example=input_example)
컴퓨팅 형식
Mosaic AI 모델 서비스 제공은 모델을 배포하기 위한 다양한 CPU 및 GPU 옵션을 제공합니다. GPU를 사용하여 배포할 때는 프레임워크에서 제공하는 메서드를 사용하여 GPU에서 예측이 실행되도록 코드를 설정해야 합니다. MLflow는 PyTorch 또는 변환기 버전으로 기록된 모델에 대해 이 작업을 자동으로 수행합니다.
워크로드 유형 | GPU 인스턴스 | 메모리 |
---|---|---|
CPU |
동시성당 4GB | |
GPU_SMALL |
1xT4 | 16GB |
GPU_LARGE |
1xA100 | 80GB |
GPU_LARGE_2 |
2xA100 | 160GB |
배포 컨테이너 및 종속성
배포하는 동안 프로덕션 수준의 컨테이너가 빌드되고 엔드포인트로 배포됩니다. 이 컨테이너에는 MLflow 모델에서 자동으로 캡처되거나 지정된 라이브러리가 포함됩니다.
컨테이너를 제공하는 모델에는 미리 설치된 종속성이 포함되어 있지 않으므로 모든 필수 종속성이 모델에 포함되지 않은 경우 종속성 오류가 발생할 수 있습니다. 모델 배포 문제가 발생할 때 Databricks는 모델을 로컬로 테스트하는 것이 좋습니다.
패키지 및 코드 종속성
사용자 지정 또는 프라이빗 라이브러리를 배포에 추가할 수 있습니다. 모델 제공과 함께 사용자 지정 Python 라이브러리 사용을 참조하세요.
MLflow 원시 버전 모델의 경우 필요한 패키지 종속성이 자동으로 캡처됩니다.
사용자 지정 pyfunc
모델의 경우 종속성을 명시적으로 추가할 수 있습니다.
다음을 사용하여 패키지 종속성을 추가할 수 있습니다.
pip_requirements
매개변수:mlflow.sklearn.log_model(model, "sklearn-model", pip_requirements = ["scikit-learn", "numpy"])
conda_env
매개변수:conda_env = { 'channels': ['defaults'], 'dependencies': [ 'python=3.7.0', 'scikit-learn=0.21.3' ], 'name': 'mlflow-env' } mlflow.sklearn.log_model(model, "sklearn-model", conda_env = conda_env)
자동으로 캡처되는 것 이상의 추가 요구 사항을 포함하려면
extra_pip_requirements
을 사용합니다.mlflow.sklearn.log_model(model, "sklearn-model", extra_pip_requirements = ["sklearn_req"])
코드 종속성이 있는 경우 code_path
을 사용하여 지정할 수 있습니다.
mlflow.sklearn.log_model(model, "sklearn-model", code_path=["path/to/helper_functions.py"],)
종속성 유효성 검사
사용자 지정 MLflow 모델을 배포하기 전에 모델이 제공될 수 있는지 확인하는 것이 좋습니다. MLflow는 배포 환경을 시뮬레이션하고 수정된 종속성을 테스트할 수 있도록 하는 모델 아티팩트 유효성 검사를 허용하는 API를 제공합니다.
MLflow Python API와 MLflow CLI에는 두 가지 배포 전 유효성 검사 API가 있습니다.
이러한 API 중 하나를 사용하여 다음을 지정할 수 있습니다.
- 모델 제공에 배포되는 모델의
model_uri
입니다. - 다음 중 하나:
- 모델의
mlflow.pyfunc.PyFuncModel.predict()
호출에 필요한 형식의input_data
입니다. input_path
에 대한 호출에 로드되고 사용될 입력 데이터가 포함된 파일을 정의하는 파일인predict
입니다.
- 모델의
csv
또는json
형식의content_type
- 파일에 예측을 쓰는 선택 사항
output_path
입니다. 이 매개 변수를 생략하면 예측이stdout
에 출력됩니다. - 서비스 환경을 빌드하는 데 사용되는 환경 관리자
env_manager
:- 기본값은
virtualenv
입니다. 유효성 검사를 제공하는 데 권장됩니다. local
은 사용할 수 있지만 유효성 검사를 제공하는 데 오류가 발생할 수 있습니다. 일반적으로 빠른 디버깅에만 사용됩니다.
- 기본값은
install_mlflow
를 사용하여 사용자 환경에 있는 현재 버전의 MLflow를 가상 환경에 설치할지 여부를 지정합니다. 이 설정은 기본적으로False
입니다.- 문제 해결 또는 디버깅을 위해 다양한 버전의 패키지 종속성을 업데이트하고 테스트할지 여부입니다. 재정의 인수
pip_requirements_override
를 사용하여 문자열 종속성 재정의 또는 추가 목록으로 지정할 수 있습니다.
예시:
import mlflow
run_id = "..."
model_uri = f"runs:/{run_id}/model"
mlflow.models.predict(
model_uri=model_uri,
input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
content_type="json",
env_manager="virtualenv",
install_mlflow=False,
pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)
종속성 업데이트
로깅된 모델로 지정된 종속성에 문제가 있는 경우 다른 모델을 기록하지 않고도 MLflow CLI 또는 MLflow Python API의 mlflow.models.model.update_model_requirements()
을 사용하여 요구 사항을 업데이트할 수 있습니다.
다음 예제에서는 기록된 모델 pip_requirements.txt
의 현재 위치를 업데이트하는 방법을 보여줍니다.
지정된 패키지 버전으로 기존 정의를 업데이트하거나 존재하지 않는 요구 사항을 pip_requirements.txt
파일에 추가할 수 있습니다. 이 파일은 지정된 model_uri
위치에 있는 MLflow 모델 아티팩트 내에 있습니다.
from mlflow.models.model import update_model_requirements
update_model_requirements(
model_uri=model_uri,
operation="add",
requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)
기대 및 제한 사항
다음 섹션에서는 모델 제공을 사용하여 사용자 지정 모델을 제공하기 위한 알려진 기대 및 제한 사항에 대해 설명합니다.
엔드포인트 만들기 및 업데이트 기대치
참고 항목
이 섹션의 정보는 파운데이션 모델 또는 외부 모델을 제공하는 엔드포인트에는 적용되지 않습니다.
새로 등록된 모델 버전을 배포하려면 모델 및 해당 모델 환경을 패키징하고 모델 엔드포인트 자체를 프로비전해야 합니다. 이 프로세스는 약 10분 정도 걸릴 수 있습니다.
Azure Databricks는 새 엔드포인트가 준비될 때까지 기존 엔드포인트 구성을 유지하여 엔드포인트의 가동 중지 시간 없이 업데이트를 수행합니다. 이렇게 하면 사용 중인 엔드포인트에서 중단이 발생할 위험이 줄어듭니다.
모델 계산이 120초 이상 걸리면 요청이 시간 초과됩니다. 모델 계산이 120초 이상 걸릴 것으로 생각되면 Azure Databricks 계정 팀에 문의하세요.
Databricks는 기존 모델 서비스 엔드포인트에서 가끔 가동 중지 시간 시스템 업데이트 및 유지 관리를 수행합니다. 유지 관리 중에 Databricks는 모델을 다시 로드하고 모델이 다시 로드되지 않을 경우 엔드포인트를 실패로 표시합니다. 사용자 지정된 모델이 견고하고 언제든지 다시 로드할 수 있는지 확인합니다.
엔드포인트 크기 조정 기대치
참고 항목
이 섹션의 정보는 파운데이션 모델 또는 외부 모델을 제공하는 엔드포인트에는 적용되지 않습니다.
서비스 엔드포인트는 트래픽 및 프로비전된 동시성 단위의 용량에 따라 자동으로 확장됩니다.
- 프로비전된 동시성: 시스템에서 처리할 수 있는 최대 병렬 요청 수입니다. 프로비전된 동시성 = QPS(초당 쿼리 수) * 모델 실행 시간 수식을 사용하여 필요한 동시성을 예측합니다.
- 크기 조정 동작: 엔드포인트는 트래픽 증가와 함께 거의 즉시 확장되며, 감소된 트래픽에 맞게 5분마다 축소됩니다.
- 0으로 축소: 엔드포인트는 30분 동안 활동이 없으면 0으로 축소될 수 있습니다. 0으로 스케일링한 후의 첫 번째 요청은 "콜드 부팅"을 경험하여 대기 시간이 길어집니다. 지연 시간에 민감한 애플리케이션의 경우 이 기능을 효과적으로 관리하기 위한 전략을 고려하세요.
GPU 워크로드 제한 사항
GPU 워크로드를 사용하여 엔드포인트를 제공하는 제한 사항은 다음과 같습니다.
- GPU 서비스용 컨테이너 이미지 만들기는 모델 크기 및 GPU에서 제공되는 모델에 대한 설치 요구 사항 증가로 인해 CPU 서비스용 이미지 생성보다 오래 걸립니다.
- 매우 큰 모델을 배포할 때 컨테이너 빌드 및 모델 배포가 60분 기간을 초과하는 경우 배포 프로세스가 시간 초과될 수 있습니다. 이 경우 프로세스의 다시 시도를 시작하면 모델을 성공적으로 배포해야 합니다.
- GPU 서비스용 자동 크기 조정은 CPU 서비스보다 오래 걸립니다.
- GPU 용량은 0으로 스케일링할 때 보장되지 않습니다. GPU 엔드포인트는 크기가 0으로 조정된 후 첫 번째 요청에 대해 추가 높은 대기 시간을 예상할 수 있습니다.
- 이 기능은
northcentralus
에서 사용할 수 없습니다.
Anaconda 라이선스 업데이트
다음은 Anaconda를 사용하는 고객을 위한 것입니다.
Important
Anaconda Inc.는 anaconda.org 채널에 대한 서비스 약관을 업데이트했습니다. 새로운 서비스 약관에 따라 Anaconda의 패키지 및 배포에 의존하는 경우 상용 라이선스가 필요할 수 있습니다. 자세한 내용은 Anaconda Commercial Edition FAQ를 참조하세요. Anaconda 채널의 사용은 해당 서비스 약관에 따라 관리됩니다.
v1.18 이전에 기록된 MLflow 모델(Databricks Runtime 8.3 ML 이하)은 기본적으로 conda defaults
채널(https://repo.anaconda.com/pkgs/)을 종속성으로 로깅했습니다. 이 라이선스 변경으로 인해 Databricks는 MLflow v1.18 이상을 사용하여 기록된 모델에 대한 채널 defaults
사용을 중지했습니다. 로깅된 기본 채널은 이제 conda-forge
(으)로, 관리되는 커뮤니티 https://conda-forge.org/를 가리킵니다.
모델에 대한 conda 환경에서 defaults
채널을 제외하지 않고 MLflow v1.18 이전 모델을 로깅한 경우 해당 모델은 의도하지 않았을 수 있는 defaults
채널에 대한 종속성을 가질 수 있습니다.
모델에 이 종속성이 있는지 여부를 수동으로 확인하려면 기록된 모델로 패키지된 conda.yaml
파일의 channel
값을 검사할 수 있습니다. 예를 들어 defaults
채널 종속성이 있는 모델의 conda.yaml
모양은 다음과 같습니다.
channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
- mlflow
- scikit-learn==0.23.2
- cloudpickle==1.6.0
name: mlflow-env
Databricks는 Anaconda와의 관계에서 Anaconda 리포지토리를 사용하여 모델과 상호 작용하는 것이 허용되는지 여부를 확인할 수 없으므로 Databricks는 고객이 변경하도록 강요하지 않습니다. Databricks 사용을 통한 Anaconda.com 리포지토리 사용이 Anaconda의 조건에 따라 허용되는 경우 어떠한 조치도 취할 필요가 없습니다.
모델 환경에서 사용되는 채널을 변경하려는 경우 새 conda.yaml
을(를) 사용하여 모델 레지스트리에 모델을 다시 등록할 수 있습니다. log_model()
의 conda_env
매개 변수에 채널을 지정하여 이 작업을 수행할 수 있습니다.
log_model()
API에 대한 자세한 내용은 작업 중인 모델 버전에 대한 MLflow 설명서(예: scikit-learn용 log_model)를 참조하세요.
conda.yaml
파일에 대한 자세한 내용은 MLflow 설명서를 참조하세요.