다음을 통해 공유


실시간 유추를 위해 새로운 배포를 안전하게 롤아웃합니다.

적용 대상:Azure CLI ml 확장 v2(현재)Python SDK azure-ai-ml v2(현재)

이 문서에서는 중단 없이 프로덕션에서 기계 학습 모델의 새 버전을 배포하는 방법을 알아봅니다. 파란색-녹색 배포 전략(안전 롤아웃 전략이라고도 함)을 사용하여 새 버전의 웹 서비스를 프로덕션에 도입합니다. 이 전략을 사용하면 새 버전의 웹 서비스를 완전히 배포하기 전에 사용자 또는 요청의 작은 하위 집합에 롤아웃할 수 있습니다.

이 문서에서는 온라인 엔드포인트, 즉 온라인(실시간) 추론에 사용되는 엔드포인트를 사용하고 있다고 가정합니다. 온라인 엔드포인트에는 관리형 온라인 엔드포인트Kubernetes 온라인 엔드포인트의 두 가지 유형이 있습니다. 엔드포인트 및 관리형 온라인 엔드포인트와 Kubernetes 온라인 엔드포인트 간의 차이점에 대한 자세한 내용은 Azure Machine Learning 엔드포인트란?을 참조하세요.

이 문서의 주요 예제에서는 배포에 관리형 온라인 엔드포인트를 사용합니다. 대신 Kubernetes 엔드포인트를 사용하려면 관리형 온라인 엔드포인트 토론과 인라인으로 제공되는 이 문서의 참고 사항을 참조하세요.

이 문서에서는 다음에 대해 알아봅니다.

  • 모델의 버전 1을 제공하기 위해 "파란색"이라는 배포로 온라인 엔드포인트를 정의합니다.
  • 파란색 배포가 더 많은 요청을 처리할 수 있도록 스케일링
  • 모델의 버전 2("녹색" 배포라고 함)를 엔드포인트에 배포하지만 배포에 라이브 트래픽을 보내지 않음
  • 녹색 배포를 격리된 상태로 테스트
  • 라이브 트래픽의 백분율을 녹색 배포에 미러링하여 유효성 검사
  • 적은 비율의 라이브 트래픽을 녹색 배포로 보내기
  • 모든 라이브 트래픽을 녹색 배포로 보내기
  • 이제 사용되지 않는 v1 파란색 배포 삭제

필수 조건

이 문서의 단계를 수행하기 전에 다음과 같은 필수 구성 요소가 있는지 확인합니다.

  • Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure Machine Learning의 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 사용자 계정에 Azure Machine Learning 작업 영역에 대한 소유자 또는 기여자 역할이 할당되거나 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*를 허용하는 사용자 지정 역할이 할당되어야 합니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.

  • (선택 사항) 로컬로 배포하려면 로컬 컴퓨터에 Docker 엔진을 설치해야 합니다. 문제를 더 쉽게 디버그할 수 있도록 이 옵션을 권장합니다.

시스템 준비

환경 변수 설정

Azure CLI에 대한 기본값을 아직 설정하지 않은 경우 기본 설정을 저장합니다. 구독, 작업 영역 및 리소스 그룹에 대한 값을 여러 번 전달하지 않으려면 다음 코드를 실행하세요.

az account set --subscription <subscription id>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>

예제 리포지토리 복제

이 문서를 따르려면 먼저 예제 리포지토리(azureml-examples)를 복제합니다. 그런 다음, 리포지토리의 cli/ 디렉터리로 이동합니다.

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli

--depth 1을 사용하여 최신 커밋만 리포지토리에 복제합니다. 이렇게 하면 작업을 완료하는 시간이 줄어듭니다.

이 자습서의 명령은 cli 디렉터리의 deploy-safe-rollout-online-endpoints.sh 파일에 있고 YAML 구성 파일은 endpoints/online/managed/sample/ 하위 디렉터리에 있습니다.

참고 항목

Kubernetes 온라인 엔드포인트에 대한 YAML 구성 파일은 endpoints/online/kubernetes/ 하위 디렉터리에 있습니다.

엔드포인트 및 배포 정의

온라인 엔드포인트는 온라인(실시간) 유추에 사용됩니다. 온라인 엔드포인트에는 클라이언트에서 데이터를 수신할 준비가 되어 있고 실시간으로 응답을 다시 보내는 배포가 포함됩니다.

엔드포인트 정의

다음 표에는 엔드포인트를 정의할 때 지정할 주요 특성이 나열되어 있습니다.

attribute 설명
이름 필수입니다. 엔드포인트의 이름입니다. Azure 지역에서 고유해야 합니다. 명명 규칙에 대한 자세한 내용은 엔드포인트 제한을 참조하세요.
인증 모드 엔드포인트에 대한 인증 방법입니다. 키 기반 인증 key와 Azure Machine Learning 토큰 기반 인증 aml_token 중에서 선택합니다. 키는 만료되지 않지만 토큰은 만료됩니다. 인증에 대한 자세한 내용은 온라인 엔드포인트에 대한 인증을 참조하세요.
설명 엔드포인트에 대한 설명입니다.
태그 엔드포인트에 대한 태그 사전입니다.
트래픽 배포 간에 트래픽을 라우팅하는 방법에 대한 규칙입니다. 트래픽을 키-값 쌍의 사전으로 표현합니다. 여기서 키는 배포 이름을 나타내고 값은 해당 배포에 대한 트래픽 비율을 나타냅니다. 엔드포인트 아래의 배포가 만들어진 경우에만 트래픽을 설정할 수 있습니다. 배포가 만들어진 후 온라인 엔드포인트에 대한 트래픽을 업데이트할 수도 있습니다. 미러링된 트래픽을 사용하는 방법에 대한 자세한 내용은 새 배포에 소량의 실시간 트래픽 할당을 참조하세요.
트래픽 미러링 배포에 미러링할 라이브 트래픽의 백분율입니다. 미러링된 트래픽을 사용하는 방법에 대한 자세한 내용은 미러링된 트래픽으로 배포 테스트를 참조하세요.

엔드포인트를 만들 때 지정할 수 있는 특성의 전체 목록을 보려면 CLI(v2) 온라인 엔드포인트 YAML 스키마 또는 SDK(v2) ManagedOnlineEndpoint 클래스를 참조하세요.

배포 정의

배포는 실제 유추를 수행하는 모델을 호스팅하는 데 필요한 리소스의 세트입니다. 다음 표에서는 배포를 정의할 때 지정하는 주요 특성에 대해 설명합니다.

attribute 설명
이름 필수입니다. 배포의 이름입니다.
엔드포인트 이름 필수입니다. 배포를 만들 엔드포인트의 이름입니다.
모델 배포에 사용할 모델입니다. 이 값은 작업 영역에서 기존 버전의 모델에 대한 참조 또는 인라인 모델 사양일 수 있습니다. 이 예에는 회귀를 수행하는 scikit-learn 모델이 있습니다.
코드 경로 모델 채점을 위한 모든 Python 소스 코드가 포함된 로컬 개발 환경의 디렉터리 경로입니다. 중첩된 디렉터리 및 패키지를 사용할 수 있습니다.
채점 스크립트 지정된 입력 요청에 따라 모델을 실행하는 Python 코드. 이 값은 소스 코드 디렉터리에 있는 채점 파일의 상대 경로일 수 있습니다.
채점 스크립트는 배포된 웹 서비스에 제출된 데이터를 수신하여 모델에 전달합니다. 그런 다음 스크립트는 모델을 실행하고 응답을 클라이언트에 반환합니다. 채점 스크립트는 모델에 따라 다르며 모델이 입력으로 예상하고 출력으로 반환하는 데이터를 이해해야 합니다.
이 예제에는 score.py 파일이 있습니다. 이 Python 코드에는 init() 함수와 run() 함수가 있어야 합니다. init() 함수는 모델을 만들거나 업데이트한 후에 호출됩니다(모델을 메모리에 캐시하는 등의 용도로 사용할 수 있음). run() 함수는 실제 채점/예측을 수행하도록 엔드포인트를 호출할 때마다 호출됩니다.
환경 필수입니다. 모델 및 코드를 호스팅할 환경입니다. 이 값은 작업 영역에서 기존 버전의 환경에 대한 참조 또는 인라인 환경 사양일 수 있습니다. 환경은 Conda 종속성이 있는 Docker 이미지, Dockerfile 또는 등록된 환경일 수 있습니다.
인스턴스 유형 필수입니다. 배포에 사용할 VM 크기입니다. 지원되는 크기 목록은 관리되는 온라인 엔드포인트 SKU 목록을 참조하세요.
인스턴트 수 필수입니다. 배포에 사용할 인스턴스 수입니다. 예상되는 워크로드 값을 기준으로 합니다. 고가용성을 위해 값을 3 이상으로 설정하는 것이 좋습니다. 업그레이드 수행을 위해 추가 20%를 예약합니다. 자세한 내용은 온라인 엔드포인트에 대한 한도를 참조하세요.

배포를 만들 때 지정할 수 있는 특성의 전체 목록을 보려면 CLI(v2) 관리형 온라인 배포 YAML 스키마 또는 SDK(v2) ManagedOnlineDeployment 클래스를 참조하세요.

온라인 엔드포인트 만들기

먼저 엔드포인트의 이름을 설정한 다음 구성합니다. 이 문서에서는 endpoints/online/managed/sample/endpoint.yml 파일을 사용하여 엔드포인트를 구성합니다. 다음 코드 조각은 파일의 콘텐츠를 보여 줍니다.

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

엔드포인트 YAML 형식에 대한 참조는 다음 표에 설명되어 있습니다. 이러한 특성을 지정하는 방법을 알아보려면 온라인 엔드포인트 YAML 참조를 참조하세요. 관리형 온라인 엔드포인트와 관련된 한도에 대한 자세한 내용은 온라인 엔드포인트에 대한 한도를 참조하세요.

설명
$schema (선택 사항) YAML 스키마입니다. YAML 파일에서 사용 가능한 모든 옵션을 보려면 브라우저에서 이전 코드 조각의 스키마를 볼 수 있습니다.
name 엔드포인트의 이름입니다.
auth_mode 키 기반 인증의 경우 key를 사용합니다. Azure Machine Learning 토큰 기반 인증에 대해 aml_token을 사용합니다. 최신 토큰을 가져오려면 az ml online-endpoint get-credentials 명령을 사용합니다.

온라인 엔드포인트를 만들려면 다음을 수행합니다.

  1. 엔드포인트 이름을 설정합니다.

    Unix의 경우 이 명령을 실행합니다(YOUR_ENDPOINT_NAME을 고유한 이름으로 바꾸기).

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Important

    엔드포인트 이름은 Azure 지역 내에서 고유해야 합니다. 예를 들어 Azure westus2 지역에는 이름이 my-endpoint인 엔드포인트 하나만 있을 수 있습니다.

  2. 클라우드에서 엔드포인트를 만듭니다.

    다음 코드를 실행하여 endpoint.yml 파일을 사용하여 엔드포인트를 구성합니다.

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

'파란색' 배포 만들기

이 문서에서는 endpoints/online/managed/sample/blue-deployment.yml 파일을 사용하여 배포의 주요 측면을 구성합니다. 다음 코드 조각은 파일의 콘텐츠를 보여 줍니다.

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

엔드포인트에 대해 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 형식을 사용합니다.

등록을 수행하려면 modelenvironment의 YAML 정의를 별도의 YAML 파일에 추출하고 az ml model createaz ml environment create 명령을 사용할 수 있습니다. 이러한 명령에 대해 자세히 알아보려면 az ml model create -haz ml environment create -h를 실행합니다.

모델을 자산으로 등록하는 방법에 대한 자세한 내용은 CLI를 사용하여 Machine Learning에서 모델을 자산으로 등록을 참조하세요. 환경을 만드는 방법에 대한 자세한 내용은 CLI & SDK(v2)를 통해 Azure Machine Learning 환경 관리를 참조하세요.

기존 배포 확인

기존 배포를 확인하는 한 가지 방법은 지정된 입력 요청에 대해 모델의 점수를 매길 수 있도록 엔드포인트를 호출하는 것입니다. 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%를 해당 배포로 라우팅합니다.

기존 엔드포인트 및 배포의 상태는 다음을 실행하여 확인할 수 있습니다.

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

$ENDPOINT_NAME이라고 식별된 엔드포인트 및 blue라는 배포가 표시됩니다.

샘플 데이터로 엔드포인트 테스트

invoke 명령을 사용하여 엔드포인트를 호출할 수 있습니다. json 파일을 사용하여 샘플 요청을 보내드립니다.

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

더 많은 트래픽을 처리하도록 기존 배포 스케일링

배포 yaml 파일에서 온라인 엔드포인트를 통해 기계 학습 모델 배포 및 채점에 설명된 배포에서 instance_count의 값을 1로 설정합니다. update 명령을 사용하여 스케일 아웃할 수 있습니다.

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

참고 항목

위의 명령에서 --set을 사용하여 배포 구성을 재정의합니다. 또는 yaml 파일을 업데이트하고 --file 입력을 사용하여 update 명령에 입력으로 전달할 수 있습니다.

새 모델을 배포하지만 아직 트래픽은 보내지 않음

green이라는 새 배포를 만듭니다.

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 배포를 테스트한 후에는 라이브 트래픽의 일정 비율을 미러링(또는 복사)할 수 있습니다. 트래픽 미러링(섀도잉이라고도 함)은 클라이언트에 반환된 결과를 변경하지 않습니다. 요청은 여전히 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%를 수신하도록 녹색 배포를 설정해 보겠습니다. 클라이언트는 여전히 파란색 배포에서만 예측을 수신합니다.

한 배포에 미러링된 10% 트래픽을 보여 주는 다이어그램.

다음 명령은 트래픽의 10%를 green 배포로 미러링합니다.

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

수신 트래픽을 수신하도록 배포를 지정하지 않고 엔드포인트를 여러 번 호출하여 미러 트래픽을 테스트할 수 있습니다.

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

배포에서 로그를 확인하여 트래픽의 특정 백분율이 green 배포로 전송되었는지 확인할 수 있습니다.

az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME

테스트 후 미러 트래픽을 0으로 설정하여 미러링을 사용하지 않도록 설정할 수 있습니다.

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

라이브 트래픽의 작은 비율을 새 배포에 할당

green 배포를 테스트한 후에는 적은 비율의 트래픽을 할당합니다.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

총 트래픽 백분율의 집계가 0%(트래픽 사용 안 함) 또는 100%(트래픽 사용)여야 합니다.

이제 green 배포가 모든 실시간 트래픽의 10%를 수신합니다. 클라이언트는 bluegreen 배포 모두에서 예측을 수신합니다.

배포 간의 트래픽 분할을 보여 주는 다이어그램.

새 배포에 모든 트래픽 보내기

green 배포가 완전히 만족스러우면 모든 트래픽을 여기로 전환합니다.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

이전 배포 제거

다음 단계에 따라 관리형 온라인 엔드포인트에서 개별 배포를 삭제할 수 있습니다. 개별 배포를 삭제하면 관리형 온라인 엔드포인트의 다른 배포에 영향을 미칩니다.

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

엔드포인트 및 배포 삭제

엔드포인트와 배포를 사용하지 않으려면 삭제해야 합니다. 엔드포인트를 삭제하면 모든 기본 배포도 삭제됩니다.

az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait