이 문서에서는 중단 없이 프로덕션에서 기계 학습 모델의 새 버전을 배포하는 방법을 알아봅니다. 파란색-녹색 배포 전략(안전 롤아웃 전략이라고도 함)을 사용하여 새 버전의 웹 서비스를 프로덕션에 도입합니다. 이 전략을 사용하면 새 버전의 웹 서비스를 완전히 배포하기 전에 사용자 또는 요청의 작은 하위 집합에 롤아웃할 수 있습니다.
이 문서에서는 온라인 엔드포인트, 즉 온라인(실시간) 추론에 사용되는 엔드포인트를 사용하고 있다고 가정합니다. 온라인 엔드포인트에는 관리형 온라인 엔드포인트와 Kubernetes 온라인 엔드포인트의 두 가지 유형이 있습니다. 엔드포인트 및 관리형 온라인 엔드포인트와 Kubernetes 온라인 엔드포인트 간의 차이점에 대한 자세한 내용은 Azure Machine Learning 엔드포인트란?을 참조하세요.
이 문서의 주요 예제에서는 배포에 관리형 온라인 엔드포인트를 사용합니다. 대신 Kubernetes 엔드포인트를 사용하려면 관리형 온라인 엔드포인트 토론과 인라인으로 제공되는 이 문서의 참고 사항을 참조하세요.
이 문서에서는 다음에 대해 알아봅니다.
모델의 버전 1을 제공하기 위해 "파란색"이라는 배포로 온라인 엔드포인트를 정의합니다.
파란색 배포가 더 많은 요청을 처리할 수 있도록 스케일링
모델의 버전 2("녹색" 배포라고 함)를 엔드포인트에 배포하지만 배포에 라이브 트래픽을 보내지 않음
Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure Machine Learning의 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 사용자 계정에 Azure Machine Learning 작업 영역에 대한 소유자 또는 기여자 역할이 할당되거나 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*를 허용하는 사용자 지정 역할이 할당되어야 합니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.
(선택 사항) 로컬로 배포하려면 로컬 컴퓨터에 Docker 엔진을 설치해야 합니다. 문제를 더 쉽게 디버그할 수 있도록 이 옵션을 권장합니다.
Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure Machine Learning의 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 사용자 계정에 Azure Machine Learning 작업 영역에 대한 소유자 또는 기여자 역할이 할당되거나 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*를 허용하는 사용자 지정 역할이 할당되어야 합니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.
(선택 사항) 로컬로 배포하려면 로컬 컴퓨터에 Docker 엔진을 설치해야 합니다. 문제를 더 쉽게 디버그할 수 있도록 이 옵션을 권장합니다.
Azure Machine Learning 작업 영역 및 컴퓨팅 인스턴스. 이러한 리소스가 없으면 빠른 시작: 작업 영역 리소스 만들기 문서의 단계에서 리소스를 만듭니다.
Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure Machine Learning의 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 사용자 계정에 Azure Machine Learning 작업 영역에 대한 소유자 또는 기여자 역할이 할당되거나 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*를 허용하는 사용자 지정 역할이 할당되어야 합니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.
작업 영역은 Azure Machine Learning의 최상위 리소스로, Azure Machine Learning을 사용할 때 만든 모든 아티팩트를 사용할 수 있는 중앙 집중식 환경을 제공합니다. 이 섹션에서는 배포 작업을 수행할 작업 영역에 연결합니다. 따라하려면 online-endpoints-safe-rollout.ipynb Notebook을 엽니다.
필요한 라이브러리 가져오기:
# import required libraries
from azure.ai.ml import MLClient
from azure.ai.ml.entities import (
ManagedOnlineEndpoint,
ManagedOnlineDeployment,
Model,
Environment,
CodeConfiguration,
)
from azure.identity import DefaultAzureCredential
참고 항목
Kubernetes 온라인 엔드포인트를 사용하는 경우 azure.ai.ml.entities 라이브러리에서 KubernetesOnlineEndpoint 및 KubernetesOnlineDeployment 클래스를 가져옵니다.
작업 영역 세부 정보를 구성하고 작업 영역에 대한 핸들을 가져옵니다.
작업 영역에 연결하려면 구독, 리소스 그룹 및 작업 영역 이름과 같은 식별자 매개 변수가 필요합니다. azure.ai.ml의 MLClient에서 이러한 세부 정보를 사용하여 필요한 Azure Machine Learning 작업 영역에 대한 핸들을 가져옵니다. 이 예제에서는 기본 Azure 인증을 사용합니다.
# enter details of your AML workspace
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"
# get a handle to the workspace
ml_client = MLClient(
DefaultAzureCredential(), subscription_id, resource_group, workspace
)
로컬 컴퓨터에 Git이 설치되어 있는 경우 지침에 따라 예제 리포지토리를 복제할 수 있습니다. 그렇지 않으면 지침에 따라 예제 리포지토리에서 파일을 다운로드합니다.
예제 리포지토리 복제
이 문서를 따라하려면 먼저 예제 리포지토리(azureml-examples)를 복제한 다음 azureml-examples/cli/endpoints/online/model-1 디렉터리로 변경합니다.
git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples/cli/endpoints/online/model-1
팁
--depth 1을 사용하여 최신 커밋만 리포지토리에 복제하여 작업을 완료하는 데 걸리는 시간을 줄입니다.
예제 리포지토리에서 파일 다운로드
예제 리포지토리를 복제한 경우 로컬 컴퓨터에는 이미 이 예제에 대한 파일 복사본이 있으므로 다음 섹션으로 건너뛸 수 있습니다. 리포지토리를 복제하지 않은 경우 로컬 컴퓨터에 다운로드할 수 있습니다.
첫 번째 모델 model-1에 대한 모델 폴더 /cli/endpoints/online/model-1/model 및 채점 스크립트 /cli/endpoints/online/model-1/onlinescoring/score.py를 찾습니다.
두 번째 모델 model-2에 대한 모델 폴더 /cli/endpoints/online/model-2/model 및 채점 스크립트 /cli/endpoints/online/model-2/onlinescoring/score.py를 찾습니다.
엔드포인트 및 배포 정의
온라인 엔드포인트는 온라인(실시간) 유추에 사용됩니다. 온라인 엔드포인트에는 클라이언트에서 데이터를 수신할 준비가 되어 있고 실시간으로 응답을 다시 보내는 배포가 포함됩니다.
엔드포인트 정의
다음 표에는 엔드포인트를 정의할 때 지정할 주요 특성이 나열되어 있습니다.
attribute
설명
이름
필수입니다. 엔드포인트의 이름입니다. Azure 지역에서 고유해야 합니다. 명명 규칙에 대한 자세한 내용은 엔드포인트 제한을 참조하세요.
인증 모드
엔드포인트에 대한 인증 방법입니다. 키 기반 인증 key와 Azure Machine Learning 토큰 기반 인증 aml_token 중에서 선택합니다. 키는 만료되지 않지만 토큰은 만료됩니다. 인증에 대한 자세한 내용은 온라인 엔드포인트에 대한 인증을 참조하세요.
설명
엔드포인트에 대한 설명입니다.
태그
엔드포인트에 대한 태그 사전입니다.
트래픽
배포 간에 트래픽을 라우팅하는 방법에 대한 규칙입니다. 트래픽을 키-값 쌍의 사전으로 표현합니다. 여기서 키는 배포 이름을 나타내고 값은 해당 배포에 대한 트래픽 비율을 나타냅니다. 엔드포인트 아래의 배포가 만들어진 경우에만 트래픽을 설정할 수 있습니다. 배포가 만들어진 후 온라인 엔드포인트에 대한 트래픽을 업데이트할 수도 있습니다. 미러링된 트래픽을 사용하는 방법에 대한 자세한 내용은 새 배포에 소량의 실시간 트래픽 할당을 참조하세요.
트래픽 미러링
배포에 미러링할 라이브 트래픽의 백분율입니다. 미러링된 트래픽을 사용하는 방법에 대한 자세한 내용은 미러링된 트래픽으로 배포 테스트를 참조하세요.
배포는 실제 유추를 수행하는 모델을 호스팅하는 데 필요한 리소스의 세트입니다. 다음 표에서는 배포를 정의할 때 지정하는 주요 특성에 대해 설명합니다.
attribute
설명
이름
필수입니다. 배포의 이름입니다.
엔드포인트 이름
필수입니다. 배포를 만들 엔드포인트의 이름입니다.
모델
배포에 사용할 모델입니다. 이 값은 작업 영역에서 기존 버전의 모델에 대한 참조 또는 인라인 모델 사양일 수 있습니다. 이 예에는 회귀를 수행하는 scikit-learn 모델이 있습니다.
코드 경로
모델 채점을 위한 모든 Python 소스 코드가 포함된 로컬 개발 환경의 디렉터리 경로입니다. 중첩된 디렉터리 및 패키지를 사용할 수 있습니다.
채점 스크립트
지정된 입력 요청에 따라 모델을 실행하는 Python 코드. 이 값은 소스 코드 디렉터리에 있는 채점 파일의 상대 경로일 수 있습니다. 채점 스크립트는 배포된 웹 서비스에 제출된 데이터를 수신하여 모델에 전달합니다. 그런 다음 스크립트는 모델을 실행하고 응답을 클라이언트에 반환합니다. 채점 스크립트는 모델에 따라 다르며 모델이 입력으로 예상하고 출력으로 반환하는 데이터를 이해해야 합니다. 이 예제에는 score.py 파일이 있습니다. 이 Python 코드에는 init() 함수와 run() 함수가 있어야 합니다. init() 함수는 모델을 만들거나 업데이트한 후에 호출됩니다(모델을 메모리에 캐시하는 등의 용도로 사용할 수 있음). run() 함수는 실제 채점/예측을 수행하도록 엔드포인트를 호출할 때마다 호출됩니다.
환경
필수입니다. 모델 및 코드를 호스팅할 환경입니다. 이 값은 작업 영역에서 기존 버전의 환경에 대한 참조 또는 인라인 환경 사양일 수 있습니다. 환경은 Conda 종속성이 있는 Docker 이미지, Dockerfile 또는 등록된 환경일 수 있습니다.
엔드포인트에 대해 blue라는 배포를 만들려면 다음 명령을 실행하여 blue-deployment.yml 파일을 사용하여 구성합니다.
az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
Important
az ml online-deployment create의 --all-traffic 플래그는 엔드포인트 트래픽의 100%를 새로 만들어진 파란색 배포에 할당합니다.
blue-deployment.yaml 파일에서 인라인으로 path(파일을 업로드할 위치)를 지정합니다. CLI는 자동으로 파일을 업로드하고 모델과 환경을 등록합니다. 프로덕션 환경에서는 모델 및 환경을 등록하고 YAML에 별도로 등록된 이름 및 버전을 지정하는 것이 모범 사례입니다. model: azureml:my-model:1 또는 environment: azureml:my-env:1 형식을 사용합니다.
등록을 수행하려면 model 및 environment의 YAML 정의를 별도의 YAML 파일에 추출하고 az ml model create 및 az ml environment create 명령을 사용할 수 있습니다. 이러한 명령에 대해 자세히 알아보려면 az ml model create -h 및 az ml environment create -h를 실행합니다.
관리형 온라인 엔드포인트를 만들려면 ManagedOnlineEndpoint 클래스를 사용합니다. 이 클래스를 통해 사용자는 엔드포인트의 주요 측면을 구성할 수 있습니다.
엔드포인트 구성:
# Creating a unique endpoint name with current datetime to avoid conflicts
import random
online_endpoint_name = "endpt-moe-" + str(random.randint(0, 10000))
# create an online endpoint
endpoint = ManagedOnlineEndpoint(
name=online_endpoint_name,
description="this is a sample online endpoint",
auth_mode="key",
tags={"foo": "bar"},
)
참고 항목
Kubernetes 온라인 엔드포인트를 만들려면 KubernetesOnlineEndpoint 클래스를 사용합니다.
Azure Machine Learning 스튜디오에서 관리형 온라인 엔드포인트를 만들 때 엔드포인트에 대한 초기 배포를 정의해야 합니다. 배포를 정의하려면 먼저 작업 영역에 등록된 모델이 있어야 합니다. 배포에 사용할 모델을 등록하는 것으로 시작할 예정입니다.
장치 등록
모델 등록은 작업 영역의 논리적 엔터티입니다. 이 엔터티는 단일 모델 파일 또는 여러 파일의 디렉터리를 포함할 수 있습니다. 프로덕션을 위한 모범 사례로 모델 및 환경을 등록해야 합니다. 이 문서에서 엔드포인트 및 배포를 만들 때 모델이 포함된 모델 폴더를 등록했다고 가정합니다.
Azure Machine Learning 스튜디오를 사용하여 브라우저에서 직접 관리형 온라인 엔드포인트를 만듭니다. 스튜디오에서 관리형 온라인 엔드포인트를 만들 때 초기 배포를 정의해야 합니다. 비어 있는 관리형 온라인 엔드포인트를 만들 수 없습니다.
스튜디오에서 관리형 온라인 엔드포인트를 만드는 한 가지 방법은 모델 페이지에서 사용하는 것입니다. 이 방법은 또한 기존의 관리형 온라인 배포에 모델을 추가하는 쉬운 방법을 제공합니다. 이전에 모델 등록 섹션에서 등록한 model-1이라는 모델을 배포하려면 다음을 수행합니다.
이 작업은 엔드포인트 및 배포에 대한 세부 정보를 지정할 수 있는 창을 엽니다. 이전 5-11단계에 설명된 대로 엔드포인트 및 배포에 대한 설정을 입력하고 배포를 만들라는 메시지가 표시될 때까지 기본값을 수락합니다.
기존 배포 확인
기존 배포를 확인하는 한 가지 방법은 지정된 입력 요청에 대해 모델의 점수를 매길 수 있도록 엔드포인트를 호출하는 것입니다. CLI 또는 Python SDK를 통해 엔드포인트를 호출할 때 수신 트래픽을 수신할 배포의 이름을 지정하도록 선택할 수 있습니다.
참고 항목
CLI 또는 Python SDK와 달리 Azure Machine Learning 스튜디오에서는 엔드포인트를 호출할 때 배포를 지정해야 합니다.
배포 이름으로 엔드포인트 호출
트래픽을 수신할 배포 이름으로 엔드포인트를 호출하면 Azure Machine Learning은 엔드포인트의 트래픽을 지정된 배포로 직접 라우팅하고 해당 출력을 반환합니다. --deployment-name 옵션 CLI v2 또는 deployment_name 옵션 SDK v2를 사용하여 배포를 지정할 수 있습니다.
배포를 지정하지 않고 엔드포인트 호출
트래픽을 수신할 배포를 지정하지 않고 엔드포인트를 호출하면 Azure Machine Learning은 트래픽 제어 설정에 따라 엔드포인트의 수신 트래픽을 엔드포인트의 배포로 라우팅합니다.
트래픽 제어 설정은 지정된 비율의 수신 트래픽을 엔드포인트의 각 배포에 할당합니다. 예를 들어, 엔드포인트의 특정 배포가 들어오는 트래픽을 40%의 시간 동안 수신하도록 트래픽 규칙에서 지정하는 경우 Azure Machine Learning은 엔드포인트 트래픽의 40%를 해당 배포로 라우팅합니다.
# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
deployment_name="blue",
request_file="../model-1/sample-request.json",
)
관리형 온라인 엔드포인트 보기
엔드포인트 페이지에서 모든 관리형 온라인 엔드포인트를 볼 수 있습니다. 엔드포인트 세부 정보 페이지로 이동하여 엔드포인트 URI, 상태, 테스트 도구, 작업 모니터, 배포 로그 및 샘플 사용 코드를 비롯한 중요한 정보를 찾을 수 있습니다.
왼쪽 탐색 모음에서 엔드포인트를 선택합니다. 여기에서 작업 영역의 모든 엔드포인트 목록을 볼 수 있습니다.
(선택 사항) 관리형 컴퓨팅 유형만 표시하도록 컴퓨팅 유형에 대한 필터를 만듭니다.
엔드포인트의 세부 정보 페이지를 보려면 엔드포인트 이름을 선택합니다.
샘플 데이터로 엔드포인트 테스트
엔드포인트 세부 정보 페이지의 테스트 탭을 사용하여 관리형 온라인 배포를 테스트합니다. 샘플 입력을 입력하고 결과를 봅니다.
엔드포인트의 세부 정보 페이지에서 테스트 탭을 선택합니다. 파란색 배포는 드롭다운 메뉴에서 이미 선택되어 있습니다.
# Get the details for online endpoint
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
# existing traffic details
print(endpoint.traffic)
# Get the scoring URI
print(endpoint.scoring_uri)
az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml
green에 트래픽을 명시적으로 할당하지 않았으므로 할당된 트래픽이 없습니다. 다음 명령을 사용하여 확인할 수 있습니다.
az ml online-endpoint show -n $ENDPOINT_NAME --query traffic
새 배포 테스트
green에는 0%의 트래픽이 할당되지만 --deployment 이름을 지정하여 직접 호출할 수 있습니다.
az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json
REST 클라이언트를 사용하여 트래픽 규칙을 거치지 않고 배포를 직접 호출하려면 다음 HTTP 헤더를 설정합니다. azureml-model-deployment: <deployment-name> 아래 코드 조각에서는 curl을 사용하여 배포를 직접 호출합니다. 코드 조각은 Unix/WSL 환경에서 작동해야 합니다.
# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json
관리형 온라인 엔드포인트에 대한 새 배포를 만들고 배포의 이름을 green으로 지정합니다.
green 배포를 테스트한 후에는 라이브 트래픽의 일정 비율을 미러링(또는 복사)할 수 있습니다. 트래픽 미러링(섀도잉이라고도 함)은 클라이언트에 반환된 결과를 변경하지 않습니다. 요청은 여전히 100% blue 배포로 흐릅니다. 미러링된 트래픽 비율이 복사되어 green 배포에 제출되므로 클라이언트에 영향을 주지 않고 메트릭과 로깅을 수집할 수 있습니다. 미러링은 클라이언트에 영향을 주지 않고 새 배포의 유효성을 검사하려는 경우에 유용합니다. 예를 들어, 미러링을 사용하여 대기 시간이 허용 가능한 범위 내에 있는지 확인하거나 HTTP 오류가 없는지 확인할 수 있습니다. 트래픽 미러링/섀도잉으로 새 배포를 테스트하는 것을 섀도 테스트라고도 합니다. 미러링된 트래픽을 수신하는 배포(이 경우 green 배포)를 섀도 배포라고도 합니다.
미러링에는 다음과 같은 제한 사항이 있습니다.
미러링은 CLI(v2)(버전 2.4.0 이상) 및 Python SDK(v2)(버전 1.0.0 이상)에서 지원됩니다. 이전 버전의 CLI/SDK를 사용하여 엔드포인트를 업데이트하면 미러 트래픽 설정이 손실됩니다.
미러링은 현재 Kubernetes 온라인 엔드포인트에 대해 지원되지 않습니다.
엔드포인트에서 하나의 배포에만 트래픽을 미러링할 수 있습니다.
미러링할 수 있는 최대 트래픽 비율은 50%입니다. 이 제한은 엔드포인트 대역폭 할당량(기본값 5MBPS)에 미치는 영향을 줄이기 위한 것입니다. 할당된 할당량을 초과하면 엔드포인트 대역폭이 제한됩니다. 대역폭 제한 모니터링에 대한 자세한 내용은 관리 온라인 엔드포인트 모니터링을 참조하세요.
또한 다음 동작에 유의해야 합니다.
라이브 트래픽 또는 미러링된 트래픽만 수신하도록 배포를 구성할 수 있습니다. 둘 다 수신할 수는 없습니다.
엔드포인트를 호출할 때 배포 이름(섀도 배포 포함)을 지정하여 예측을 반환할 수 있습니다.
들어오는 트래픽을 수신할 배포 이름으로 엔드포인트를 호출하면 Azure Machine Learning은 트래픽을 섀도 배포에 미러링하지 않습니다. Azure Machine Learning은 배포를 지정하지 않은 경우 엔드포인트로 전송된 트래픽에서 섀도 배포로 트래픽을 미러링합니다.
이제 미러링된 트래픽의 10%를 수신하도록 녹색 배포를 설정해 보겠습니다. 클라이언트는 여전히 파란색 배포에서만 예측을 수신합니다.
수신 트래픽을 수신하도록 배포를 지정하지 않고 엔드포인트를 여러 번 호출하여 미러 트래픽을 테스트할 수 있습니다.
# You can test mirror traffic by invoking the endpoint several times
for i in range(20):
ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
request_file="../model-1/sample-request.json",
)
배포에서 로그를 확인하여 트래픽의 특정 백분율이 green 배포로 전송되었는지 확인할 수 있습니다.
이제 엔드포인트 세부 정보 페이지에 green 배포에 대한 10%의 미러링된 트래픽 할당이 표시됩니다.
미러링된 트래픽을 테스트하려면 Azure CLI 또는 Python 탭을 참조하여 엔드포인트를 여러 번 호출합니다. 배포에서 로그를 확인하여 트래픽의 특정 백분율이 green 배포로 전송되었는지 확인합니다. 엔드포인트의 배포 로그 탭에서 배포 로그에 액세스할 수 있습니다. 메트릭 및 로그를 사용하여 미러링된 트래픽의 성능을 모니터링할 수도 있습니다. 자세한 내용은 온라인 엔드포인트 모니터링을 참조하세요.
테스트 후 미러링을 사용하지 않도록 설정할 수 있습니다.
엔드포인트 세부 정보 페이지에서 트래픽 업데이트를 선택합니다.
미러링된 트래픽을 사용하지 않도록 설정하려면 미러링된 트래픽 사용 옆의 단추를 다시 슬라이드합니다.