ML 추론에 Dataflow를 사용하는 경우 RunInference 변환을 사용하는 것이 좋습니다. 이 변환을 사용하면 다음과 같은 여러 이점이 있습니다.
- 로컬 추론을 실행할 때 Dataflow 작업자에 최적화된 지능형 모델 메모리 관리
- 파이프라인 특성과 사용자 정의 제약 조건을 사용하여 성능을 최적화하는 동적 일괄 처리
- 더 나은 처리량과 지연 시간을 제공할 수 있는 ML 인식 Dataflow 백엔드 기능
- 원격 추론 할당량에 도달할 때 지능형 백오프 및 자동 확장 메커니즘
- 프로덕션 준비가 완료된 측정항목 및 운영 기능
RunInference를 사용할 때는 다음 사항을 고려해야 합니다.
메모리 관리
중형 또는 대형 ML 모델을 로드하면 머신의 메모리가 부족할 수 있습니다. Dataflow는 ML 모델을 로드할 때 메모리 부족 (OOM) 오류를 방지하는 데 도움이 되는 도구를 제공합니다. 다음 표를 사용하여 시나리오에 적합한 방식을 결정하세요.
| 시나리오 | 솔루션 | 
|---|---|
| 모델이 메모리에 적합할 만큼 작습니다. | 추가 구성 없이 RunInference변환을 사용합니다.RunInference변환은 스레드 간에 모델을 공유합니다. 머신에 CPU 코어당 모델 하나가 적합하면 파이프라인에서 기본 구성을 사용할 수 있습니다. | 
| 서로 다르게 학습된 모델 여러 개에서 같은 태스크를 수행하고 있습니다. | 모델별 키를 사용합니다. 자세한 내용은 서로 다르게 학습된 모델 여러 개로 ML 추론 실행을 참조하세요. | 
| 모델 하나가 메모리에 로드되고 모든 프로세스가 이 모델을 공유합니다. | 
 커스텀 모델 핸들러를 빌드하는 경우  | 
| 머신에 로드되는 모델 수를 정확하게 구성해야 합니다. | 로드되는 모델 수를 정확하게 제어하려면  커스텀 모델 핸들러를 빌드하는 경우  | 
Dataflow로 메모리를 관리하는 방법에 대한 자세한 내용은 Dataflow의 메모리 부족 오류 문제 해결을 참조하세요.
일괄 처리
Beam에서 일괄 처리를 수행하는 방법은 여러 가지가 있지만 추론을 실행할 때는 RunInference 변환을 사용하여 일괄 처리를 처리하는 것이 좋습니다. 특정 배치 크기에서 모델의 성능이 가장 좋은 경우 RunInference의 타겟 배치 크기 파라미터를 제한하는 것이 좋습니다. 대부분의 모델 핸들러는 최대 및 최소 배치 크기를 파라미터로 노출합니다. 예를 들어 HuggingFace 파이프라인에 제공되는 배치 크기를 제어하려면 다음 모델 핸들러를 정의하면 됩니다.
mh = HuggingFacePipelineModelHandler('text-classification', min_batch_size=4, max_batch_size=16)
RunInference 변환은 항상 최대 배치 크기를 준수합니다. 최소 배치 크기가 목표이지만 모든 경우에 적용된다고 보장할 수는 없습니다. 예를 들어 다음 섹션의 번들 기반 일괄 처리를 참고하세요.
번들 기반 일괄 처리
Dataflow는 번들에서 변환으로 데이터를 전달합니다. 이러한 번들의 크기는 Dataflow 정의 휴리스틱에 따라 다를 수 있습니다. 일반적으로 배치 파이프라인의 번들은 매우 큰 반면(O(100) 요소) 스트리밍 파이프라인의 번들은 매우 작을 수 있습니다(크기 1 포함).
기본적으로 RunInference는 각 번들에서 일괄 처리를 생성하며 번들 간에 일괄 처리하지 않습니다. 즉, 최소 배치 크기가 8이지만 번들에 3개의 요소만 남아 있는 경우 RunInference는 배치 크기 3을 사용합니다. 대부분의 모델 핸들러는 이 동작을 재정의할 수 있는 max_batch_duration_secs 파라미터를 노출합니다. max_batch_duration_secs가 설정되면 RunInference가 번들 전반에 걸쳐 일괄 처리됩니다. 변환이 단일 번들로 타겟 배치 크기를 달성할 수 없는 경우 배치를 생성하기 전에 최대 max_batch_duration_secs 동안 기다립니다. 예를 들어 HuggingFace 파이프라인을 사용할 때 번들 간 일괄 처리를 사용 설정하려면 다음 모델 핸들러를 정의하면 됩니다.
mh = HuggingFacePipelineModelHandler('text-classification', min_batch_size=4, max_batch_size=16, max_batch_duration_secs=3)
이 기능은 파이프라인에서 배치 크기가 매우 낮은 경우에 유용합니다. 그렇지 않으면 번들 간 일괄 처리의 동기화 비용이 비싼 셔플을 유발할 수 있으므로 일반적으로 사용할 가치가 없습니다.
오류 처리
오류 처리는 모든 프로덕션 파이프라인에서 중요한 부분입니다. Dataflow는 임의 번들에서 요소를 처리하며 해당 번들의 요소에 오류가 발생하면 전체 번들을 재시도합니다. 추가 오류 처리를 적용하지 않으면 Dataflow는 일괄 모드에서 실행할 때 실패 항목이 포함된 번들을 4번 다시 시도합니다. 단일 번들이 4번 실패하면 파이프라인이 완전히 실패합니다. 스트리밍 모드에서 실행하는 경우 Dataflow는 실패 항목이 포함된 번들을 무기한 재시도하므로 파이프라인이 영구적으로 중단될 수 있습니다.
RunInference는 with_exception_handling 함수를 사용하여 내장 오류 처리 메커니즘을 제공합니다.
이 함수를 적용하면 모든 실패가 오류 메시지와 함께 별도의 실패 PCollection으로 라우팅됩니다. 이렇게 하면 다시 처리할 수 있습니다. 사전 처리 또는 사후 처리 작업을 모델 핸들러와 연결하면 RunInference에서도 이러한 작업을 실패 컬렉션으로 라우팅합니다. 예를 들어 전처리 및 후처리 작업이 있는 모델 핸들러에서 모든 실패를 수집하려면 다음 로직을 사용하세요.
main, other = pcoll | RunInference(model_handler.with_preprocess_fn(f1).with_postprocess_fn(f2)).with_exception_handling()
# handles failed preprocess operations, indexed in the order in which they were applied
other.failed_preprocessing[0] | beam.Map(logging.info)
# handles failed inferences
other.failed_inferences | beam.Map(logging.info)
# handles failed postprocess operations, indexed in the order in which they were applied
other.failed_postprocessing[0] | beam.Map(logging.info)
제한 시간
RunInference의 with_exception_handling 기능을 사용하면 각 작업의 제한 시간을 설정할 수도 있으며, 이는 배치별로 계산됩니다. 이렇게 하면 단일 추론이 멈춰 전체 파이프라인이 응답하지 않는 상황을 방지할 수 있습니다. 시간 초과가 발생하면 시간 초과된 레코드가 실패 PCollection으로 라우팅되고 모든 모델 상태가 정리되고 다시 생성되며 정상 실행이 계속됩니다.
# Timeout execution after 60 seconds
main, other = pcoll | RunInference(model_handler).with_exception_handling(timeout=60)
Beam 2.68.0부터는 --element_processing_timeout_minutes 파이프라인 옵션을 사용하여 제한 시간을 지정할 수도 있습니다. 이 경우 제한 시간으로 인해 실패한 작업 항목이 데드 레터 대기열로 라우팅되는 대신 성공할 때까지 재시도됩니다.
가속기 사용
가속기를 사용할 때 많은 모델 핸들러에는 사용 설정할 수 있는 가속기별 구성이 있습니다. 예를 들어 GPU와 Hugging Face 파이프라인을 사용하는 경우 device 파라미터를 GPU로 설정하는 것이 좋습니다.
mh = HuggingFacePipelineModelHandler('text-classification', device='GPU')
단일 VM 인스턴스로 시작하여 파이프라인을 로컬에서 실행하는 것도 좋습니다. 이렇게 하려면 GPU 문제 해결 가이드에 설명된 단계를 따르세요. 이렇게 하면 파이프라인을 실행하는 데 필요한 시간을 크게 줄일 수 있습니다. 이 방법을 사용하면 작업의 실적을 더 잘 파악할 수 있습니다.
Dataflow에서 가속기를 사용하는 방법에 대한 자세한 내용은 GPU 및 TPU에 관한 Dataflow 문서를 참고하세요.
종속 항목 관리
ML 파이프라인에는 PyTorch나 TensorFlow와 같은 크고 중요한 종속 항목이 포함되는 경우가 많습니다. 이러한 종속 항목을 관리하려면 작업을 프로덕션에 배포할 때 커스텀 컨테이너를 사용하는 것이 좋습니다. 이렇게 하면 여러 실행에서 안정적인 환경에서 작업이 실행되고 디버깅이 간소화됩니다.
종속 항목 관리에 대한 자세한 내용은 Beam의 Python 종속 항목 관리 페이지를 참고하세요.
다음 단계
- 실제 예시는 Dataflow ML 노트북 참고하기
- AI/ML 파이프라인 문서에서 Apache Beam과 함께 ML을 사용하는 방법 자세히 알아보기
- RunInferenceAPI에 대해 자세히 알아보기
- RunInference변환을 모니터링하는 데 사용할 수 있는 측정항목 알아보기
- Dataflow의 ML 기능 개요를 보려면 Dataflow ML 정보 페이지로 돌아가기