적용 대상:
Azure CLI ml 확장 v2(현재)
Python SDK azure-ai-ml v2(현재)
일괄 처리 엔드포인트를 사용하면 대규모로 장기 실행 유추를 수행하는 모델을 배포할 수 있습니다. 모델을 배포할 때 입력 데이터를 통해 모델을 사용하여 예측을 만드는 방법을 나타내는 채점 스크립트(일괄 처리 드라이버 스크립트라고도 함)를 만들고 지정해야 합니다. 이 문서에서는 다양한 시나리오에 대해 모델 배포에서 점수 매기기 스크립트를 사용하는 방법을 알아봅니다. 일괄 처리 엔드포인트에 대한 모범 사례에 대해서도 알아봅니다.
팁
MLflow 모델에는 채점 스크립트가 필요하지 않습니다. 서비스가 자동으로 그것을 생성해줍니다. MLflow 모델에서 일괄 처리 엔드포인트가 작동하는 방식에 대한 자세한 내용은 일괄 처리 배포에서 MLflow 모델 사용 전용 자습서를 참조하세요.
경고
일괄 처리 엔드포인트에서 자동화된 ML 모델을 배포하려면 자동화된 ML은 온라인 엔드포인트에서만 작동하는 점수 매기기 스크립트를 제공합니다. 해당 점수 매기기 스크립트는 일괄 처리를 위해 설계되지 않았습니다. 모델에서 수행하는 작업에 맞게 사용자 지정된 채점 스크립트를 만드는 방법에 대한 자세한 내용은 다음 지침을 참조하세요.
채점 스크립트 이해
점수 매기기 스크립트는 모델을 실행하고 일괄 배포 실행기가 제출하는 입력 데이터를 읽는 방법을 지정하는 Python 파일(.py)입니다. 각 모델 배포는 만들 때 채점 스크립트를 다른 모든 필수 종속성과 함께 제공합니다. 채점 스크립트는 일반적으로 다음과 같습니다.
점수 매기기 스크립트에는 다음의 두 가지 메서드가 포함되어야 합니다.
init 메서드
비용이 많이 드는 준비 또는 일반적인 준비에 init() 메서드를 사용합니다. 예를 들어, 모델을 메모리에 로드하는 데 사용합니다. 전체 일괄 작업 시작 시 이 함수를 한 번 호출합니다. 모델의 파일은 환경 변수 AZUREML_MODEL_DIR에 의해 결정된 경로에서 사용할 수 있습니다. 모델을 등록하는 방법에 따라 해당 파일이 폴더에 포함될 수 있습니다. 다음 예에서는 모델의 model 폴더에 여러 파일이 있습니다. 자세한 내용은 모델이 사용하는 폴더를 확인하는 방법을 참조하세요.
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
# load the model
model = load_model(model_path)
이 예제에서는 모델을 전역 변수에 배치합니다 model. 채점 함수에 대한 유추를 수행하는 데 필요한 자산을 사용 가능하게 하려면 전역 변수를 사용합니다.
run 메서드
일괄 처리 배포가 생성하는 각 미니 일괄 처리의 점수를 처리하려면 run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] 메서드를 사용합니다. 이 메서드는 입력 데이터에 대해 생성된 각 mini_batch에 대해 한 번씩 호출됩니다. 일괄 처리 배포는 배포를 구성하는 방법에 따라 일괄 처리로 데이터를 읽습니다.
import pandas as pd
from typing import List, Any, Union
def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
results = []
for file in mini_batch:
(...)
return pd.DataFrame(results)
메서드는 파일 경로 목록을 매개 변수(mini_batch)로 받습니다. 이 목록을 사용하여 각 파일을 반복하고 개별적으로 처리하거나 전체 일괄 처리를 읽고 한 번에 처리할 수 있습니다. 최상의 옵션은 컴퓨터 메모리와 달성해야 하는 처리량에 따라 다릅니다. 전체 데이터 일괄 처리를 한 번에 읽는 방법을 설명하는 예를 보려면 높은 처리량 배포를 참조하세요.
참고
작업 배포 방식
일괄 처리 배포는 파일 수준에서 작업을 배포합니다. 즉, 100개 파일이 포함된 폴더와 10개 파일의 미니 일괄 처리가 각각 10개 파일로 구성된 10개의 일괄 처리를 생성합니다. 관련 파일의 크기는 관련이 없습니다. 파일이 너무 커서 큰 미니 일괄 처리에서 처리할 수 없는 경우 파일을 더 작은 파일로 분할하여 더 높은 수준의 병렬 처리를 수행하거나 미니 일괄 처리당 파일 수를 줄입니다. 현재 일괄 처리 배포에서는 파일 크기 배포의 불균형을 고려할 수 없습니다.
run() 메서드는 Pandas DataFrame 또는 배열/목록을 반환해야 합니다. 반환되는 각 출력 요소는 입력 mini_batch에서 입력 요소의 성공적인 실행 1건을 나타냅니다. 파일 또는 폴더 데이터 자산의 경우 반환된 각 행/요소는 처리된 단일 파일을 나타냅니다. 표 형식 데이터 자산의 경우 반환된 각 행/요소는 처리된 파일의 행을 나타냅니다.
중요합니다
예측을 작성하는 방법
함수가 run() 반환하는 모든 항목은 일괄 처리 작업이 생성하는 출력 예측 파일에 추가됩니다. 이 함수에서 올바른 데이터 형식을 반환하는 것이 중요합니다. 단일 예측을 출력해야 하는 경우 배열을 반환합니다. 여러 정보를 반환해야 하는 경우 Pandas DataFrame을 반환합니다. 예를 들어 표 형식 데이터의 경우 원래 레코드에 예측을 추가할 수 있습니다. 이를 수행하려면 Pandas DataFrame을 사용합니다. pandas DataFrame에는 열 이름이 포함될 수 있지만 출력 파일에는 해당 이름이 포함되지 않습니다.
다른 방식으로 예측을 작성하려면 일괄 처리 배포에서 출력을 사용자 지정할 수 있습니다.
경고
run 함수에서는 pandas.DataFrame 대신 복합 데이터 형식(또는 복합 데이터 형식 목록)을 출력하지 마세요. 이러한 출력은 문자열로 변환되며 읽기가 어려워집니다.
결과 DataFrame 또는 배열은 표시된 출력 파일에 추가됩니다. 결과의 카디널리티에 대한 요구 사항은 없습니다. 한 파일은 출력에서 하나 이상의 행/요소를 생성할 수 있습니다. 결과 DataFrame 또는 배열의 모든 요소는 있는 그대로 출력 파일에 기록됩니다(output_action이 summary_only가 아님을 고려).
채점을 위한 Python 패키지
일괄 처리 배포가 실행되는 환경에서 채점 스크립트를 실행하는 데 필요한 라이브러리를 표시해야 합니다. 점수 매기기 스크립트의 경우 배포당 환경을 나타냅니다. 일반적으로 다음과 같은 conda.yml 종속성 파일을 사용하여 요구 사항을 나타냅니다.
mnist/environment/conda.yaml
name: mnist-env
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip<22.0
- pip:
- torch==1.13.0
- torchvision==0.14.0
- pytorch-lightning
- pandas
- azureml-core
- azureml-dataset-runtime[fuse]
모델의 환경을 표시하는 방법에 대한 자세한 내용은 일괄 처리 배포 만들기를 참조하세요.
다른 방식으로 예측 작성
기본적으로 일괄 처리 배포는 배포에 표시된 대로 모델의 예측을 단일 파일에 씁니다. 그러나 경우에 따라 여러 파일에 예측을 작성해야 합니다. 예를 들어 분할된 입력 데이터의 경우 분할된 출력도 생성하려고 할 수 있습니다. 이러한 경우 일괄 처리 배포의 출력을 사용자 지정하여 다음을 나타낼 수 있습니다.
- 예측을 작성하는 데 사용되는 파일 형식(CSV, Parquet, json 등)
- 출력에서 데이터가 분할되는 방식
자세한 내용은 일괄 배포에서 출력 사용자 지정을 참조하세요.
점수 매기기 스크립트의 소스 제어
점수 매기기 스크립트를 소스 제어에 배치합니다.
점수 매기기 스크립트 작성 모범 사례
대량의 데이터를 처리하는 점수 매기기 스크립트를 작성할 때는 다음과 같은 몇 가지 요인을 고려합니다.
- 각 파일의 크기
- 각 파일의 데이터 양
- 각 파일을 읽는 데 필요한 메모리 양
- 전체 파일 일괄 처리를 읽는 데 필요한 메모리 양
- 모델의 메모리 공간
- 입력 데이터를 통해 실행할 때의 모델 메모리 공간
- 컴퓨팅에서 사용 가능한 메모리
일괄 처리 배포는 파일 수준에서 작업을 배포합니다. 이 배포는 100개의 파일이 포함된 폴더를 10개 파일의 미니 일괄 처리로 생성한다는 것을 의미하며, 관련된 파일의 크기에 관계없이 각각 10개의 파일 일괄 처리가 생성됩니다. 파일이 너무 커서 큰 미니 일괄 처리에서 처리할 수 없는 경우 파일을 더 작은 파일로 분할하여 더 높은 수준의 병렬 처리를 수행하거나 미니 일괄 처리당 파일 수를 줄입니다. 현재 일괄 처리 배포는 파일 크기 분포의 오차를 고려할 수 없습니다.
병렬 처리 수준과 점수 매기기 스크립트 간의 관계
배포 구성은 각 미니 일괄 처리의 크기와 각 노드의 작업자 수 모두를 제어합니다. 이 구성은 전체 미니 일괄 처리를 읽어 유추를 수행할지, 파일별로 유추 파일을 실행할지, 아니면 테이블 형식으로 유추 행을 실행할지 결정할 때 중요합니다. 자세한 내용은 미니 일괄 처리, 파일 또는 행 수준에서 유추 실행을 참조하세요.
동일한 인스턴스에서 여러 작업자를 실행하는 경우 모든 작업자가 메모리를 공유한다는 것을 기억하세요. 노드당 작업자 수를 늘리면 일반적으로 미니 일괄 처리 크기를 줄이거나 데이터 크기 및 컴퓨팅 SKU가 동일하게 유지되는 경우 점수 매기기 전략을 변경해야 합니다.
미니 배치, 파일 또는 행 수준에서 유추 실행
일괄 처리 엔드포인트는 미니 일괄 처리당 한 번씩 채점 스크립트에서 run() 함수를 호출합니다. 그러나 전체 일괄 처리, 한 번에 하나의 파일 또는 표 형식 데이터의 경우 한 번에 하나의 행에 대해 유추를 실행할 것인지 결정할 수 있습니다.
미니 일괄 처리 수준
일반적으로 배치 점수 계산 과정에서 높은 처리량을 달성하기 위해 전체 배치에 대해 추론을 실행합니다. 이 접근 방식은 GPU를 통한 추론을 실행하여 추론 장치를 최대로 활용하고자 할 때 잘 작동합니다. 데이터가 메모리에 맞지 않는 경우, TensorFlow 또는 PyTorch 같은 데이터 로더를 사용하여 일괄 처리를 자체적으로 수행할 수 있습니다. 이러한 경우 전체 일괄 처리에서 유추를 실행합니다.
경고
일괄 처리 수준에서 유추를 실행하려면 메모리 요구 사항을 올바르게 설명하고 메모리 부족 예외를 방지하기 위해 입력 데이터 크기를 면밀히 제어해야 할 수 있습니다. 전체 미니 일괄 처리를 메모리에 로드할 수 있는지 여부는 미니 일괄 처리 크기, 클러스터의 인스턴스 크기, 각 노드의 작업자 수 및 미니 일괄 처리 크기에 따라 다릅니다.
이를 달성하는 방법을 알아보려면 높은 처리량 배포를 참조하세요. 이 예는 한 번에 전체 파일 일괄 처리를 처리합니다.
파일 수준
유추를 수행하는 가장 쉬운 방법 중 하나는 미니 일괄 처리의 모든 파일을 반복한 다음 각 파일에 대해 모델을 실행하는 것입니다. 이미지 처리와 같은 경우에 이 방법은 잘 작동합니다. 테이블 형식 데이터의 경우 각 파일의 행 수를 예측해야 합니다. 이 예측값은 모델에서 메모리 요구 사항을 처리하여 전체 데이터를 메모리에 로드하고 이를 유추할 수 있는지 여부를 보여 줍니다. 일부 모델(특히 순환 신경망을 기반으로 한 모델)은 잠재적으로 비선형 행 수가 있는 메모리 공간을 펼치고 표시합니다. 메모리 비용이 높은 모델의 경우 행 수준에서 유추를 실행하는 것이 좋습니다.
팁
너무 커서 한 번에 읽을 수 없는 파일을 여러 작은 파일로 분해하여 병렬 처리를 개선하는 것이 좋습니다.
이를 수행하는 방법을 알아보려면 일괄 처리 배포를 통한 이미지 처리를 참조하세요. 해당 예는 한 번에 파일을 처리합니다.
행 수준(테이블 형식)
입력 크기에 문제가 있는 모델의 경우 행 수준에서 유추를 실행하는 것이 좋습니다. 일괄 처리 배포는 여전히 파일의 미니 일괄 처리와 함께 채점 스크립트를 제공합니다. 그러나 한 번에 하나의 파일, 한 행씩 읽습니다. 이 방법은 비효율적인 것처럼 보일 수 있지만 일부 딥 러닝 모델의 경우 하드웨어 리소스를 확장하지 않고 유추를 수행하는 유일한 방법일 수 있습니다.
이를 수행하는 방법을 알아보려면 일괄 처리 배포를 통한 텍스트 처리를 참조하세요. 이 예는 한 번에 한 행씩 처리합니다.
폴더인 모델 사용
환경 변수는 AZUREML_MODEL_DIR 선택한 모델 위치에 대한 경로를 포함합니다. 함수 init()는 일반적으로 모델을 메모리에 로드하는 데 사용됩니다. 그러나 일부 모델은 폴더에 해당 파일을 포함할 수 있으며 로드할 때 해당 구조를 고려해야 할 수도 있습니다. 다음과 같이 모델의 폴더 구조를 식별할 수 있습니다.
Azure Machine Learning 포털로 이동합니다.
모델 섹션으로 이동합니다.
배포하려는 모델을 선택하고 Artifacts 탭을 선택합니다.
표시된 폴더를 기록해 두세요. 이 폴더는 모델이 등록될 때 표시됩니다.
모델을 로드하려면 다음 경로를 사용합니다.
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
model = load_model(model_path)