적용 대상:Azure CLI ml 확장 v2(현재)
Python SDK azure-ai-ml v2(현재)
Azure Machine Learning에서 사용자 지정 컨테이너를 사용하여 온라인 엔드포인트에 모델을 배포할 수 있습니다. 사용자 지정 컨테이너 배포는 Azure Machine Learning에서 사용하는 기본 Python Flask 서버 이외의 웹 서버를 사용할 수 있습니다.
사용자 지정 배포를 사용하는 경우 다음을 수행할 수 있습니다.
- TensorFlow 서비스(TF 서비스), TorchServe, Triton 유추 서버, 배관공 R 패키지 및 Azure Machine Learning 유추 최소 이미지와 같은 다양한 도구와 기술을 사용합니다.
- Azure Machine Learning에서 제공하는 기본 제공 모니터링, 크기 조정, 경고 및 인증을 계속 활용합니다.
이 문서에서는 TF 서비스 이미지를 사용하여 TensorFlow 모델을 제공하는 방법을 보여 줍니다.
필수 조건
Azure Machine Learning 작업 영역 작업 영역을 만드는 방법에 대한 지침은 작업 영역 만들기를 참조하세요.
Azure CLI 및
ml
확장 또는 Azure Machine Learning Python SDK v2:Azure CLI 및
ml
확장을 설치하려면 CLI 설치 및 설정(v2)을 참조하세요.이 문서의 예제에서는 Bash 셸 또는 호환되는 셸을 사용한다고 가정합니다. 예를 들어 Linux 시스템 또는 Linux용 Windows 하위 시스템에서 셸을 사용할 수 있습니다.
작업 영역을 포함하고 귀하 또는 서비스 주체가 참가자 권한을 가진 Azure 리소스 그룹입니다. 작업 영역 만들기의 단계를 사용하여 작업 영역을 구성하는 경우 이 요구 사항을 충족합니다.
로컬로 설치 및 실행되는 Docker 엔진. 이 필수 구성 요소는 매우 권장됩니다. 모델을 로컬로 배포하는 데 필요하며 디버깅에 유용합니다.
배포 예제
다음 표에서는 사용자 지정 컨테이너를 사용하고 다양한 도구와 기술을 활용하는 배포 예제 를 나열합니다.
예시 | Azure CLI 스크립트 | 설명 |
---|---|---|
minimal/multimodel | deploy-custom-container-minimal-multimodel | Azure Machine Learning 유추 최소 이미지를 확장하여 단일 배포에 여러 모델을 배포합니다. |
최소/단일 모델 | 사용자 정의 컨테이너 최소 단일 모델 배포 | Azure Machine Learning 유추 최소 이미지를 확장하여 단일 모델을 배포합니다. |
mlflow/multideployment-scikit | deploy-custom-container-mlflow-multideployment-scikit | 서로 다른 Python 요구 사항이 있는 두 개의 MLFlow 모델을 단일 엔드포인트 뒤에 있는 두 개의 별도 배포에 배포합니다. Azure Machine Learning 유추 최소 이미지를 사용합니다. |
r/multimodel-plumber | 맞춤형 컨테이너 R 다중 모델 배포 - Plumber | 하나의 엔드포인트에 세 개의 회귀 모델을 배포합니다. 배관공 R 패키지를 사용합니다. |
tfserving/half-plus-two | 맞춤형 컨테이너 배포-TF서빙-반 더하기 이 | TF 서비스 사용자 지정 컨테이너를 사용하여 Half Plus Two 모델을 배포합니다. 표준 모델 등록 프로세스를 사용합니다. |
tfserving/half-plus-two-integrated | 커스텀 컨테이너 배포 - TF서빙 반 플러스 투 통합 | 이미지에 통합된 모델과 함께 TF 서비스 사용자 지정 컨테이너를 사용하여 Half Plus Two 모델을 배포합니다. |
torchserve/densenet | deploy-custom-container-torchserve-densenet | TorchServe 사용자 지정 컨테이너를 사용하여 단일 모델을 배포합니다. |
triton/단일모델 | 맞춤형 컨테이너 배포 - 트라이톤 단일 모델 | 사용자 지정 컨테이너를 사용하여 Triton 모델을 배포합니다. |
이 문서에서는 tfserving/half-plus-two 예제를 사용하는 방법을 보여줍니다.
경고
Microsoft 지원 팀은 사용자 지정 이미지로 인한 문제를 해결하는 데 도움이 되지 않을 수 있습니다. 문제가 발생하는 경우 기본 이미지 또는 Microsoft에서 제공하는 이미지 중 하나를 사용하여 문제가 이미지와 관련이 있는지 확인하라는 메시지가 표시될 수 있습니다.
소스 코드 다운로드
이 문서의 단계에서는 azureml-examples 리포지토리의 코드 샘플을 사용합니다. 다음 명령을 사용하여 리포지토리를 복제합니다.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
환경 변수 초기화
TensorFlow 모델을 사용하려면 여러 환경 변수가 필요합니다. 다음 명령을 실행하여 해당 변수를 정의합니다.
BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1
TensorFlow 모델 다운로드
입력 값을 2로 나누고 결과에 2를 추가하는 모델을 다운로드하고 압축을 풉니다.
wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH
로컬 환경에서 TF 서빙 이미지 테스트하기
Docker를 사용하여 테스트를 위해 이미지를 로컬로 실행합니다.
docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
-e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
--name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10
이미지에 활동성 및 점수 매기기 요청 보내기
활동성 요청을 보내 컨테이너 내의 프로세스가 실행 중인지 확인합니다. 응답 상태 코드가 200 OK여야 합니다.
curl -v http://localhost:8501/v1/models/$MODEL_NAME
레이블이 지정되지 않은 데이터에 대한 예측을 얻을 수 있는지 확인하기 위해 점수 매기기 요청을 보냅니다.
curl --header "Content-Type: application/json" \
--request POST \
--data @$BASE_PATH/sample_request.json \
http://localhost:8501/v1/models/$MODEL_NAME:predict
이미지 중지
로컬에서 테스트를 완료하면 이미지를 중지합니다.
docker stop tfserving-test
Azure에 온라인 엔드포인트 배포
Azure에 온라인 엔드포인트를 배포하려면 다음 섹션의 단계를 수행합니다.
엔드포인트 및 배포를 위한 YAML 파일 만들기
YAML을 사용하여 클라우드 배포를 구성할 수 있습니다. 예를 들어 엔드포인트를 구성하려면 다음 줄이 포함된 tfserving-endpoint.yml YAML 파일을 만들 수 있습니다.
$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token
배포를 구성하려면 다음 줄이 포함된 tfserving-deployment.yml YAML 파일을 만들 수 있습니다.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
name: tfserving-mounted
version: <model-version>
path: ./half_plus_two
environment_variables:
MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/<model-version>
MODEL_NAME: half_plus_two
environment:
#name: tfserving
#version: 1
image: docker.io/tensorflow/serving:latest
inference_config:
liveness_route:
port: 8501
path: /v1/models/half_plus_two
readiness_route:
port: 8501
path: /v1/models/half_plus_two
scoring_route:
port: 8501
path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1
다음 섹션에서는 YAML 및 Python 매개 변수에 대한 중요한 개념에 대해 설명합니다.
기본 이미지
YAML의 environment
섹션 또는 Python의 Environment
생성자에서 기본 이미지를 매개 변수로 지정합니다. 이 예제에서는 값으로 image
사용합니다docker.io/tensorflow/serving:latest
.
컨테이너를 검사하는 경우 이 서버가 명령을 사용하여 ENTRYPOINT
진입점 스크립트를 시작하는 것을 볼 수 있습니다. 이 스크립트는 다음과 같은 MODEL_BASE_PATH
MODEL_NAME
환경 변수를 사용하고 다음과 같은 8501
포트를 노출합니다. 이러한 세부 정보는 모두 이 서버와 관련이 있으며 이 정보를 사용하여 배포를 정의하는 방법을 결정할 수 있습니다. 예를 들어 배포 정의에서 MODEL_BASE_PATH
환경 변수 및 MODEL_NAME
환경 변수를 설정하는 경우 TF Serving는 이러한 값을 사용하여 서버를 시작합니다. 마찬가지로 배포 정의에서 각 경로에 대한 포트를 8501
설정하는 경우 해당 경로에 대한 사용자 요청은 TF 서비스 서버로 올바르게 라우팅됩니다.
이 예제는 TF 서비스 사례를 기반으로 합니다. 그러나 활동성, 준비 상태 및 점수 매기기 경로로 이동하는 요청에 응답하고 유지되는 모든 컨테이너를 사용할 수 있습니다. Dockerfile을 구성하여 컨테이너를 만드는 방법을 보려면 다른 예제를 참조하세요. 일부 서버는 지침 대신 ENTRYPOINT
지침을 사용합니다CMD
.
inference_config 매개 변수
environment
섹션 또는 클래스 inference_config
에서 Environment
매개 변수입니다. 활동성, 준비 상태 및 점수 매기기 경로의 세 가지 유형의 경로에 대한 포트 및 경로를 지정합니다.
inference_config
관리되는 온라인 엔드포인트를 사용하여 사용자 고유의 컨테이너를 실행하려면 매개 변수가 필요합니다.
준비 경로와 활동성 경로 비교
일부 API 서버는 서버의 상태를 확인하는 방법을 제공합니다. 상태를 확인하기 위해 지정할 수 있는 두 가지 유형의 경로가 있습니다.
- 활동성 경로: 서버가 실행 중인지 확인하려면 활동성 경로를 사용합니다.
- 준비 경로: 서버가 작업을 수행할 준비가 되었는지 확인하려면 준비 경로를 사용합니다.
기계 학습 추론의 컨텍스트에서 서버는 모델을 로드하기 전에 활동성 요청에 200 OK 상태 코드로 응답할 수 있습니다. 서버는 모델을 메모리에 로드한 후에만 상태 코드 200 OK로 준비 요청에 응답할 수 있습니다.
활동성 및 준비 상태 프로브에 대한 자세한 내용은 활동성, 준비 상태 및 시작 프로브 구성을 참조하세요.
선택한 API 서버는 활동성 및 준비 경로를 결정합니다. 컨테이너를 로컬로 테스트할 때 이전 단계에서 해당 서버를 식별합니다. 이 문서에서는 TF 서비스 제공이 활동성 경로만 정의하기 때문에 배포 예제에서는 활동성 및 준비 경로에 대해 동일한 경로를 사용합니다. 경로를 정의하는 다른 방법은 다른 예제를 참조하세요.
점수 매기기 경로
사용하는 API 서버는 작업할 페이로드를 수신하는 방법을 제공합니다. 기계 학습 추론의 컨텍스트에서 서버는 특정 경로를 통해 입력 데이터를 받습니다. 이전 단계에서 컨테이너를 로컬로 테스트할 때 API 서버에 대한 해당 경로를 식별합니다. 만들 배포를 정의할 때 해당 경로를 점수 매기기 경로로 지정합니다.
배포를 성공적으로 만들면 엔드포인트의 scoring_uri
매개 변수도 업데이트됩니다. 다음 명령을 az ml online-endpoint show -n <endpoint-name> --query scoring_uri
실행하여 이 사실을 확인할 수 있습니다.
탑재된 모델 찾기
온라인 엔드포인트로 모델을 배포하는 경우 Azure Machine Learning은 모델을 엔드포인트로 탑재합니다. 모델이 탑재되면 새 Docker 이미지를 만들지 않고도 새 버전의 모델을 배포할 수 있습니다. 기본적으로 my-model 및 버전 1 이름으로 등록된 모델은 배포된 컨테이너 내의 다음 경로에 있습니다. /var/azureml-app/azureml-models/my-model/1.
예를 들어 다음 설정을 고려합니다.
- /azureml-examples/cli/endpoints/online/custom-container의 로컬 머신에 있는 디렉터리 구조
-
half_plus_two
의 모델 이름
tfserving-deployment.yml 파일에 해당 섹션에 다음 줄이 포함되어 있다고 model
가정합니다. 이 섹션에서 값은 name
Azure Machine Learning에서 모델을 등록하는 데 사용하는 이름을 참조합니다.
model:
name: tfserving-mounted
version: 1
path: ./half_plus_two
이 경우 배포를 만들 때 모델은 /var/azureml-app/azureml-models/tfserving-mounted/1 폴더 아래에 있습니다.
필요에 따라 model_mount_path
값을 구성할 수 있습니다. 이 설정을 조정하여 모델이 탑재되는 경로를 변경할 수 있습니다.
중요합니다
이 값은 model_mount_path
Linux(컨테이너 이미지의 OS)에서 유효한 절대 경로여야 합니다.
값을 model_mount_path
변경하면 환경 변수도 업데이트 MODEL_BASE_PATH
해야 합니다.
MODEL_BASE_PATH
를 model_mount_path
와 동일한 값으로 설정하여 기본 경로를 찾을 수 없는 오류로 인한 배포 실패를 방지하십시오.
예를 들어 매개 변수를 model_mount_path
tfserving-deployment.yml 파일에 추가할 수 있습니다.
MODEL_BASE_PATH
값을 해당 파일에서 업데이트할 수도 있습니다.
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
name: tfserving-mounted
version: 1
path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
environment_variables:
MODEL_BASE_PATH: /var/tfserving-model-mount
...
배포 과정에서, 모델은 /var/tfserving-model-mount/tfserving-mounted/1에 위치하게 됩니다. 더 이상 azureml-app/azureml-models가 아니라 사용자가 지정하는 탑재 경로 아래에 있습니다.
엔드포인트 및 배포 만들기
YAML 파일을 생성한 후 다음 명령을 사용하여 엔드포인트를 만듭니다.
az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-endpoint.yml
다음 명령을 사용하여 배포를 만듭니다. 이 단계는 몇 분 동안 실행될 수 있습니다.
az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-deployment.yml --all-traffic
엔드포인트 호출
배포가 완료되면 배포된 엔드포인트에 점수 매기기 요청을 합니다.
RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)
엔드포인트 삭제
엔드포인트가 더 이상 필요하지 않은 경우 다음 명령을 실행하여 삭제합니다.
az ml online-endpoint delete --name tfserving-endpoint