적용 대상:Azure CLI ml 확장 v2(현재)
이 문서에서는 실시간 유추를 위해 MLflow 모델을 온라인 엔드포인트 에 배포하는 방법을 알아보세요. MLflow 모델을 온라인 엔드포인트에 배포하는 경우 이 기능은 코드 없는 배포이므로 채점 스크립트 또는 환경을 지정할 필요가 없습니다.
코드 없는 배포의 경우 Azure Machine Learning은 다음을 수행합니다.
- conda.yaml 파일에 나열하는 Python 패키지를 동적으로 설치합니다. 따라서 컨테이너 런타임 중에 종속성이 설치됩니다.
- 다음 항목을 포함하는 MLflow 기본 이미지 또는 큐레이팅된 환경을 제공합니다.
-
azureml-inference-server-http
패키지 -
mlflow-skinny
패키지 - 추론을 위한 점수 매기기 스크립트
-
팁
공용 네트워크 액세스 권한이 없는 작업 영역에서 MLflow 모델을 송신 연결 없이 온라인 엔드포인트에 배포하려면 모델을 패키지해야 합니다. 모델 패키징 기능은 미리 보기로 제공됩니다. 모델을 패키지할 때 인터넷 연결이 필요하지 않도록 할 수 있습니다. 그렇지 않으면 Azure Machine Learning에서 MLflow 모델에 필요한 Python 패키지를 동적으로 설치해야 합니다.
필수 조건
Azure 구독 Azure 구독이 없는 경우, 시작하기 전에 무료 계정을 만드십시오.
다음 Azure RBAC(Azure 역할 기반 액세스 제어) 역할 중 하나 이상이 있는 사용자 계정:
- Azure Machine Learning 작업 영역에 대한 소유자 역할
- Azure Machine Learning 작업 영역에 대한 기여자 역할
- 권한이 있는
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
사용자 지정 역할
Azure Machine Learning에 대한 액세스:
Azure CLI 및
ml
확장을 Azure CLI에 설치합니다. 설치 단계는 CLI 설치 및 설정(v2)을 참조하세요.
예에 대한 정보
이 문서의 예제에서는 MLflow 모델을 온라인 엔드포인트에 배포하여 예측을 수행하는 방법을 보여 줍니다. 이 예에서는 Diabetes 데이터 세트를 기반으로 하는 MLflow 모델을 사용합니다. 이 데이터 세트에는 나이, 성별, 체질량 지수, 평균 혈압 및 442명의 당뇨병 환자로부터 얻은 6개의 혈청 측정값인 10개의 기준 변수가 포함되어 있습니다. 또한 기준 데이터의 날짜 이후 1년 후에 질병 진행의 양적 측정값인 관심의 응답을 포함합니다.
모델은 회귀기를 사용하여 scikit-learn
학습되었습니다. 필요한 모든 전처리는 파이프라인으로 패키지되므로 이 모델은 원시 데이터에서 예측으로 이동되는 엔드 투 엔드 파이프라인입니다.
이 문서의 정보는 azureml-examples 리포지토리의 코드 샘플을 기반으로 합니다. 리포지토리를 복제하는 경우 YAML 파일 및 기타 파일을 복사하거나 붙여넣지 않고도 이 문서의 명령을 로컬로 실행할 수 있습니다. 다음 명령을 사용하여 리포지토리를 복제하고 코딩 언어의 폴더로 이동합니다.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Jupyter Notebooks에서 따라 하기
이 문서의 단계를 따르려면 예제 리포지토리의 온라인 엔드포인트 Notebook에 MLflow 모델 배포 를 참조하세요.
작업 영역에 연결
Azure Machine Learning 작업 영역에 연결합니다.
az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> ___location=<___location>
모델 등록
등록된 모델만 온라인 엔드포인트에 배포할 수 있습니다. 이 문서의 단계에서는 당뇨병 데이터 세트에 대해 학습된 모델을 사용합니다. 이 경우 복제된 리포지토리에 모델의 로컬 복사본이 이미 있으므로 작업 영역의 레지스트리에만 모델을 게시하면 됩니다. 배포하려는 모델이 이미 등록된 경우 이 단계를 건너뛸 수 있습니다.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
모델이 실행 중에 기록된다면 어떻게 될까요?
모델이 실행 중에 기록된 경우에는 직접 등록할 수 있습니다.
모델을 등록하려면 해당 스토리지 위치를 알고 있어야 합니다.
- MLflow
autolog
기능을 사용하는 경우 모델의 경로는 모델 유형 및 프레임워크에 따라 달라집니다. 작업 출력을 확인하여 모델 폴더의 이름을 식별합니다. 이 폴더에는 MLModel이라는 파일이 포함되어 있습니다. - 이 메서드를
log_model
사용하여 모델을 수동으로 기록하는 경우 모델에 대한 경로를 해당 메서드에 대한 인수로 전달합니다. 예를 들어mlflow.sklearn.log_model(my_model, "classifier")
을 사용하여 모델을 기록하는 경우,classifier
은 모델이 저장된 경로입니다.
Azure Machine Learning CLI v2를 사용하여 학습 작업 출력에서 모델을 만들 수 있습니다. 다음 코드는 ID $RUN_ID
가 있는 작업의 아티팩트를 사용하여 명명 $MODEL_NAME
된 모델을 등록합니다.
$MODEL_PATH
는 작업이 모델을 저장하는 데 사용하는 경로입니다.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
온라인 엔드포인트에 MLflow 모델 배포
다음 코드를 사용하여 모델을 배포할 엔드포인트의 이름 및 인증 모드를 구성합니다.
다음 명령을 실행하여 엔드포인트 이름을 설정합니다. 먼저 고유한 이름으로 대체
YOUR_ENDPOINT_NAME
합니다.export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
엔드포인트를 구성하려면 다음 줄이 포함된 create-endpoint.yaml이라는 YAML 파일을 만듭니다.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
엔드포인트 만들기:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
배포를 구성합니다. 배포는 실제 유추를 수행하는 모델을 호스팅하는 데 필요한 리소스의 세트입니다.
다음 줄을 포함하는 sklearn-deployment.yaml이라는 YAML 파일을 만듭니다.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
참고 항목
scoring_script
및environment
의 자동 생성은PyFunc
모델 타입에 대해서만 지원됩니다. 다른 모델 버전을 사용하려면 MLflow 모델 배포 사용자 지정을 참조하세요.배포 만들기:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
엔드포인트에 송신 연결이 없는 경우
--package-model
플래그를 포함시켜 모델 패키징(미리 보기)을 사용합니다.az ml online-deployment create --package-model --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
배포에 모든 트래픽 할당 지금까지 엔드포인트에는 하나의 배포가 있지만 트래픽이 할당되지 않았습니다.
Azure CLI에서 생성할 때
--all-traffic
플래그를 사용하면 이 단계가 필요하지 않습니다. 트래픽을 변경해야 하는 경우 명령을 사용할az ml online-endpoint update --traffic
수 있습니다. 트래픽을 업데이트하는 방법에 대한 자세한 내용은 트래픽 을 점진적으로 업데이트하는 방법을 참조하세요.엔드포인트 구성을 업데이트합니다.
Azure CLI에서 생성할 때
--all-traffic
플래그를 사용하면 이 단계가 필요하지 않습니다. 트래픽을 변경해야 하는 경우 명령을 사용할az ml online-endpoint update --traffic
수 있습니다. 트래픽을 업데이트하는 방법에 대한 자세한 내용은 트래픽 을 점진적으로 업데이트하는 방법을 참조하세요.
엔드포인트 호출
배포가 준비되면 이를 사용하여 요청을 처리할 수 있습니다. 배포를 테스트하는 한 가지 방법은 배포 클라이언트에서 기본 제공 호출 기능을 사용하는 것입니다. 예제 리포지토리에서 sample-request-sklearn.json 파일에는 다음 JSON 코드가 포함됩니다. 배포에 대한 샘플 요청 파일로 사용할 수 있습니다.
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
참고 항목
이 파일은 input_data
대신 MLflow 서비스에서 사용하는 inputs
키를 사용합니다. Azure Machine Learning을 사용하려면 엔드포인트에 대한 Swagger 계약을 자동으로 생성할 수 있는 다른 입력 형식이 필요합니다. 예상 입력 형식에 대한 자세한 내용은 MLflow 기본 제공 서버의 배포와 Azure Machine Learning 추론 서버의 배포를 참조하세요.
엔드포인트에 요청을 제출합니다.
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
응답은 다음 텍스트와 유사해야 합니다.
[
11633.100167144921,
8522.117402884991
]
중요합니다
MLflow 코드 없는 배포의 경우 로컬 엔드포인트를 통한 테스트 는 현재 지원되지 않습니다.
MLflow 모델 배포 사용자 지정
온라인 엔드포인트에 대한 MLflow 모델의 배포 정의에서 채점 스크립트를 지정할 필요가 없습니다. 그러나 유추 프로세스를 사용자 지정하려는 경우 점수 매기기 스크립트를 지정할 수 있습니다.
일반적으로 다음 경우에 MLflow 모델 배포를 사용자 지정하려고 합니다.
- 모델에는 맛이 없습니다
PyFunc
. - 모델을 실행하는 방법을 사용자 지정해야 합니다. 예를 들어, 특정 풍미를 사용하여 모델을 로드하려면
mlflow.<flavor>.load_model()
를 사용해야 합니다. - 모델이 이 처리를 수행하지 않으므로 점수 매기기 루틴에서 전처리 또는 후처리를 수행해야 합니다.
- 모델의 출력을 표 형식 데이터로 잘 나타낼 수 없습니다. 예를 들어 출력은 이미지를 나타내는 텐서입니다.
중요합니다
MLflow 모델 배포에 대한 점수 매기기 스크립트를 지정하는 경우 배포가 실행되는 환경도 지정해야 합니다.
사용자 지정 점수 매기기 스크립트 배포
사용자 지정 점수 매기기 스크립트를 사용하는 MLflow 모델을 배포하려면 다음 섹션의 단계를 수행합니다.
모델 폴더 식별
다음 단계를 수행하여 MLflow 모델이 포함된 폴더를 식별합니다.
Azure Machine Learning 스튜디오로 이동합니다.
모델 섹션으로 이동합니다.
배포할 모델을 선택한 후에 아티팩트 탭으로 이동합니다.
표시되는 폴더를 기록해 둡다. 모델을 등록할 때 이 폴더를 지정합니다.
채점 스크립트 생성
score.py 다음 채점 스크립트는 MLflow 모델을 사용하여 유추를 수행하는 방법의 예를 제공합니다. 이 스크립트를 필요한 대로 조정하거나 일부를 변경하여 시나리오를 반영할 수 있습니다. 이전에 식별한 model
폴더 이름이 함수에 init()
포함되어 있습니다.
import logging
import os
import json
import mlflow
from io import StringIO
from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json
def init():
global model
global input_schema
# "model" is the path of the mlflow artifacts when the model was registered. For automl
# models, this is generally "mlflow-model".
model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
model = mlflow.pyfunc.load_model(model_path)
input_schema = model.metadata.get_input_schema()
def run(raw_data):
json_data = json.loads(raw_data)
if "input_data" not in json_data.keys():
raise Exception("Request must contain a top level key named 'input_data'")
serving_input = json.dumps(json_data["input_data"])
data = infer_and_parse_json_input(serving_input, input_schema)
predictions = model.predict(data)
result = StringIO()
predictions_to_json(predictions, result)
return result.getvalue()
경고
MLflow 2.0 권고: 예제 점수 매기기 스크립트는 MLflow 1.X 및 MLflow 2.X에서 작동합니다. 그러나 해당 버전에서 예상되는 입력 및 출력 형식은 다를 수 있습니다. 환경 정의를 확인하여 사용하는 MLflow 버전을 확인합니다. MLflow 2.0은 Python 3.8 이상 버전에서만 지원됩니다.
환경 만들기
다음 단계는 채점 스크립트를 실행할 수 있는 환경을 만드는 것입니다. 모델은 MLflow 모델이므로 conda 요구 사항도 모델 패키지에 지정됩니다. MLflow 모델에 포함된 파일에 대한 자세한 내용은 MLmodel 형식을 참조하세요. 파일의 conda 종속성을 사용하여 환경을 빌드합니다. 그러나 Azure Machine Learning에서 azureml-inference-server-http
온라인 배포에 필요한 패키지도 포함해야 합니다.
다음 줄을 포함하는 conda.yaml이라는 conda 정의 파일을 만들 수 있습니다.
channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
- mlflow
- scikit-learn==1.7.0
- cloudpickle==3.1.1
- psutil==7.0.0
- pandas==2.3.0
- azureml-inference-server-http
name: mlflow-env
참고 항목
이 conda 파일의 dependencies
섹션에는 azureml-inference-server-http
패키지가 포함되어 있습니다.
이 conda 종속성 파일을 사용하여 환경을 만듭니다.
환경은 배포 구성에서 인라인으로 만들어집니다.
배포를 생성하기
엔드포인트/온라인/ncd 폴더에서 다음 줄을 포함하는 배포 구성 파일 deployment.yml 만듭니다.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: sklearn-diabetes-custom
endpoint_name: my-endpoint
model: azureml:sklearn-diabetes@latest
environment:
image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
conda_file: sklearn-diabetes/environment/conda.yaml
code_configuration:
code: sklearn-diabetes/src
scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1
배포 만들기:
az ml online-deployment create -f endpoints/online/ncd/deployment.yml
요청 처리
배포가 완료되면 요청을 처리할 준비가 된 것입니다. 배포를 테스트하는 한 가지 방법은 다음의 sample-request-sklearn.json과 같은 샘플 요청 파일을 사용하여 invoke
메서드를 사용하는 것입니다.
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
엔드포인트에 요청을 제출합니다.
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
응답은 다음 텍스트와 유사해야 합니다.
{
"predictions": [
1095.2797413413252,
1134.585328803727
]
}
경고
MLflow 2.0 권고: MLflow 1.X에서는 응답에 predictions
키가 포함되지 않습니다.
리소스 정리
엔드포인트가 더 이상 필요하지 않은 경우 연결된 리소스를 삭제합니다.
az ml online-endpoint delete --name $ENDPOINT_NAME --yes