기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
관찰성
작은 정보
Amazon EKS 워크숍을 통해 모범 사례를 살펴봅니다
모니터링 및 관찰성
GPU 지표 설명
GPU 사용률 지표는 샘플 기간 동안 GPU가 작업을 실행했는지 여부를 보여줍니다. 이 지표는 GPU가 하나 이상의 명령을 실행한 시간의 백분율을 캡처하지만 GPU가 하드웨어를 얼마나 효율적으로 사용했는지는 나타내지 않습니다. GPU에는 명령을 실행하는 병렬 처리 장치인 여러 스트리밍 멀티프로세서(SMs)가 포함되어 있습니다. 100% 사용률 판독값은 GPU가 모든 SMs에서 과중한 병렬 워크로드를 실행했음을 의미하거나 샘플 기간 동안 작은 명령 하나로 GPU를 활성화했음을 의미할 수 있습니다. 실제 사용률을 이해하려면 하드웨어 아키텍처의 여러 수준에서 GPU 지표를 검사해야 합니다. 각 스트리밍 멀티프로세서는 서로 다른 코어 유형으로 빌드되며 각 계층은 서로 다른 성능 특성을 노출합니다. 최상위 지표(GPU 사용률, 메모리 사용률, GPU 전력 및 GPU 온도, nvidia-smi를 통해 표시)는 디바이스가 활성 상태인지 여부를 보여줍니다. 더 깊은 지표(SM 사용률, SM 활동 및 텐서 코어 사용량)는 GPU가 리소스를 얼마나 효율적으로 사용하는지 보여줍니다.
높은 GPU 전력 사용량 목표
사용률이 낮은 GPUs 워크로드가 모든 GPU 구성 요소를 동시에 참여시키지 못하기 때문에 컴퓨팅 용량을 낭비하고 비용을 높입니다. Amazon EKS의 AI/ML 워크로드의 경우 프록시로 GPU 전력 사용량을 추적하여 실제 GPU 활동을 식별합니다. GPU 사용률은 GPU가 커널을 실행하는 시간의 비율을 보고하지만 스트리밍 멀티프로세서, 메모리 컨트롤러 및 텐서 코어가 모두 동시에 활성 상태인지 여부는 드러나지 않습니다. 완전히 연결된 하드웨어는 경량 커널을 실행하거나 작업 사이에 유휴 상태로 있는 하드웨어보다 훨씬 더 많은 전력을 소비하기 때문에 전력 사용량이이 격차를 야기합니다. 전력 소비를 GPU의 열 설계 전력(TDP)과 비교하여 사용률이 낮은 것을 발견한 다음 CPU 사전 처리, 네트워크 I/O 또는 비효율적인 배치 크기로 인해 워크로드에 병목 현상이 발생하는지 조사합니다.
Amazon EKS에서 CloudWatch Container Insights를 설정하여 GPU 전력 소비가 적은 포드, 노드 또는 워크로드를 식별합니다. 이 도구는 Amazon EKS와 직접 통합되어 GPU 전력 소비를 모니터링하고 전력 사용량이 목표 수준 아래로 떨어질 때 포드 스케줄링 또는 인스턴스 유형을 조정할 수 있습니다. 고급 시각화 또는 사용자 지정 대시보드가 필요한 경우 Kubernetes 네이티브 모니터링을 위해 Prometheus 및 Grafana와 함께 NVIDIA의 DCGM-Exporter를 사용합니다. 두 지표 모두 nvidia_smi_power_draw (GPU 전력 소비) 및 nvidia_smi_temperature_gpu (GPU 온도)와 같은 주요 NVIDIA 지표에 접근합니다. 지표 목록은 https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-NVIDIA-GPU.htm 참조하십시오. 특정 시간 동안 지속적으로 낮은 전력 사용량 또는 특정 작업과 같은 패턴을 찾습니다. 이러한 추세는 워크로드를 통합하거나 리소스 할당을 조정할 위치를 식별하는 데 도움이 됩니다.
Kubernetes의 정적 리소스 제한(예: CPU, 메모리 및 GPU 수)은 특히 수요가 변동하는 추론과 같은 동적 AI/ML 워크로드의 경우 과다 프로비저닝 또는 과소 사용으로 이어지는 경우가 많습니다. 사용률 추세를 분석하고 워크로드를 더 적은 수의 GPUs. 추가 GPU를 할당하기 전에 각 GPU가 전체 사용률에 도달했는지 확인합니다. 이 접근 방식은 낭비를 줄이고 비용을 절감합니다. 예약 및 공유 전략 최적화에 대한 자세한 지침은 EKS 컴퓨팅 및 오토 스케일링 모범 사례를 참조하세요.
관찰성 및 지표
AI/ML 워크로드에 모니터링 및 관찰성 도구 사용
최신 AI/ML 서비스에는 인프라, 모델링 및 애플리케이션 로직 간의 조정이 필요합니다. 플랫폼 엔지니어는 인프라 및 관찰성 스택을 관리합니다. 지표를 수집, 저장 및 시각화합니다. AI/ML 엔지니어는 모델별 지표를 정의하고 다양한 로드 및 데이터 분포에서 성능을 모니터링합니다. 애플리케이션 개발자는 APIs 사용하고, 요청을 라우팅하고, 서비스 수준 지표 및 사용자 상호 작용을 추적합니다. 통합 관찰성 관행이 없으면 이러한 팀은 사일로에서 작업하고 시스템 상태 및 성능에 대한 중요한 신호를 놓치게 됩니다. 환경 간에 공유 가시성을 설정하면 모든 이해관계자가 문제를 조기에 감지하고 안정적인 서비스를 유지할 수 있습니다.
AI/ML 워크로드에 Amazon EKS 클러스터를 최적화하면 특히 GPU 메모리 관리와 관련된 고유한 모니터링 문제가 발생합니다. 적절한 모니터링이 없으면 조직은 out-of-memory(OOM) 오류, 리소스 비효율성 및 불필요한 비용에 직면하게 됩니다. 효과적인 모니터링을 통해 EKS 고객의 성능, 복원력을 높이고 비용을 절감할 수 있습니다. 세 가지 모니터링 계층을 결합하는 전체적인 접근 방식을 사용합니다. 먼저 NVIDIA DCGM Exporter
도구 및 프레임워크
여러 도구와 프레임워크는 AI/ML 워크로드를 모니터링하기 위한 기본 out-of-the-box 지표를 제공합니다. 이러한 기본 제공 지표를 사용하면 사용자 지정 계측이 필요하지 않으며 설정 시간이 단축됩니다. 지표는 추론 서비스 및 벤치마킹에 중요한 지연 시간, 처리량 및 토큰 생성과 같은 성능 측면에 중점을 둡니다. 네이티브 지표를 사용하면 사용자 지정 컬렉션 파이프라인을 빌드하지 않고도 즉시 모니터링을 시작할 수 있습니다.
-
vLLM: 요청 지연 시간 및 메모리 사용량과 같은 기본 지표를 제공하는 대규모 언어 모델(LLMs)을 위한 고처리량 서비스 엔진입니다.
-
Ray: 작업 실행 시간 및 리소스 사용률을 포함하여 확장 가능한 AI 워크로드에 대한 지표를 내보내는 분산 컴퓨팅 프레임워크입니다.
-
Hugging Face Text Generation Inference(TGI): 추론 성능에 대한 지표가 내장된 LLMs을 배포하고 제공하기 위한 도구 키트입니다.
-
NVIDIA genai-perf: 생성형 AI 모델을 벤치마킹하고 처리량, 지연 시간 및 특정 시간 간격으로 완료된 요청과 같은 LLM별 지표를 측정하는 명령줄 도구입니다.
관찰성 방법
다음 방법 중 하나로 추가 관찰성 메커니즘을 구현하는 것이 좋습니다.
CloudWatch Container Insights 조직에서 최소한의 설정으로 AWS 네이티브 도구를 선호하는 경우 CloudWatch Container Insights를 사용하는 것이 좋습니다. NVIDIA DCGM Exporter
Container Insights를 설치한 후 CloudWatch는 환경에서 NVIDIA GPUs 자동으로 감지하고 중요한 상태 및 성능 지표를 수집합니다. 이러한 지표는 큐레이션된 out-of-the-box 대시보드에 표시됩니다. 통합 CloudWatch 에이전트를 사용하여 Ray
사용 가능한 지표의 전체 목록은 Amazon EKS 및 Kubernetes Container Insights 지표를 참조하세요. GPU 모니터링 구현에 대한 step-by-step 지침은 Amazon CloudWatch Container Insights를 사용하여 NVIDIA GPU 워크로드에 대한 운영 인사이트 얻기를 참조하세요
Managed Prometheus 및 Grafana 조직에서 사용자 지정 대시보드와 고급 시각화 기능이 필요한 경우 Kubernetes용 NVIDIA DCGM-Exporter
Ray 및 vLLM Ray 및 vLLM과 같은 오픈 소스 프레임워크를 통합하여 기본 지표https://awslabs.github.io/ai-on-eks/docs/blueprints/inference/GPUs/vLLM-rayserve
이 모니터링 스택 배포에 대한 step-by-step 지침은 AWS 관리형 오픈 소스 서비스를 사용하여 Amazon EKS에서 GPU 워크로드 모니터링을
코어 훈련 모니터링 및 지표 미세 조정 고려
핵심 훈련 지표를 모니터링하여 Amazon EKS 클러스터와 클러스터에서 실행되는 기계 학습 워크로드의 상태와 성능을 추적합니다. 훈련 워크로드는 장기간 실행되고 리소스를 다르게 소비하며 모델 수렴 및 데이터 파이프라인 효율성에 대한 가시성이 필요하기 때문에 추론 워크로드와 모니터링 요구 사항이 다릅니다. 아래 지표는 병목 현상을 식별하고, 리소스 할당을 최적화하고, 훈련 작업이 성공적으로 완료되도록 하는 데 도움이 됩니다. 이 모니터링 접근 방식 구현에 대한 step-by-step 지침은 Amazon EKS에서 기계 학습 워크로드 관찰 소개
리소스 사용 지표
리소스 사용량 지표를 모니터링하여 리소스가 제대로 사용되고 있는지 확인합니다. 이러한 지표는 병목 현상과 근본 원인 성능 문제를 식별하는 데 도움이 됩니다.
-
CPU, 메모리, 네트워크, GPU 전력 및 GPU 온도 - 할당된 리소스가 워크로드 수요를 충족하고 최적화 기회를 식별할 수 있도록 이러한 지표를 모니터링합니다. gpu_memory_usage_bytes와 같은 지표를 추적하여 메모리 소비 패턴을 식별하고 최대 사용량을 감지합니다. 훈련 중 가장 높은 메모리 수요를 이해하기 위해 95번째 백분위수(P95)와 같은 백분위수를 계산합니다. 이 분석을 통해 모델과 인프라를 최적화하여 OOM 오류를 방지하고 비용을 절감할 수 있습니다.
-
SM 점유, SM 활동, FPxx 활동 - 이러한 지표를 모니터링하여 GPU의 기본 리소스가 어떻게 사용되고 있는지 파악합니다. SM 활동에 대한 대상 0.8은 경험 규칙
입니다. -
노드 및 포드 리소스 사용률 - 노드 및 포드 수준에서 리소스 사용량을 추적하여 리소스 경합과 잠재적 병목 현상을 식별합니다. 노드가 용량 제한에 근접하는지 모니터링하여 포드 스케줄링을 지연시키고 훈련 작업을 늦출 수 있습니다.
-
리소스 사용률 요청 및 한도와 비교 - 실제 리소스 사용량을 구성된 요청 및 한도와 비교하여 클러스터가 현재 워크로드를 처리하고 향후 워크로드를 수용할 수 있는지 확인합니다. 이 비교를 통해 OOM 오류나 리소스 낭비를 방지하기 위해 리소스 할당을 조정해야 하는지 여부를 알 수 있습니다.
-
ML 프레임워크의 내부 지표 - TensorFlow 및 PyTorch와 같은 ML 프레임워크에서 내부 훈련 및 수렴 지표를 캡처합니다. 이러한 지표에는 손실 곡선, 학습률, 배치 처리 시간 및 훈련 단계 기간이 포함됩니다. TensorBoard 또는 유사한 도구를 사용하여 이러한 지표를 시각화하여 모델 수렴을 추적하고 훈련 비효율성을 식별합니다.
모델 성능 지표
모델 성능 지표를 모니터링하여 훈련 프로세스가 정확도 및 비즈니스 요구 사항을 충족하는 모델을 생성하는지 확인합니다. 이러한 지표는 훈련을 중지하고, 모델 버전을 비교하고, 성능 저하를 식별할 시기를 결정하는 데 도움이 됩니다.
-
정확도, 정밀도, 재현율 및 F1-score 이러한 지표를 추적하여 모델이 검증 데이터에서 얼마나 잘 작동하는지 파악합니다. 각 훈련 에포크 후 검증 세트의 F1-score 계산하여 모델이 개선되고 있는지 여부와 허용 가능한 성능 수준에 도달했을 때를 평가합니다.
-
비즈니스별 지표 및 KPIs - AI/ML 이니셔티브의 비즈니스 가치를 직접 측정하는 지표를 정의하고 추적합니다. 권장 시스템의 경우 클릭률 또는 전환율과 같은 지표를 추적하여 모델이 의도한 비즈니스 성과를 주도하는지 확인합니다.
-
시간 경과에 따른 성능 - 모델 버전과 훈련 실행의 성능 지표를 비교하여 추세를 식별하고 성능 저하를 감지합니다. 최신 모델 버전이 기준 모델과 비교하여 성능을 유지하는지 또는 개선하는지 추적합니다. 이 기록 비교는 새 모델을 배포할지 아니면 훈련 문제를 조사할지 결정하는 데 도움이 됩니다.
데이터 품질 및 드리프트 지표
데이터 품질 및 드리프트 지표를 모니터링하여 훈련 데이터가 일관되고 대표적인지 확인합니다. 데이터 드리프트는 시간이 지남에 따라 모델 성능이 저하될 수 있는 반면, 데이터 품질 문제는 모델이 수렴하거나 신뢰할 수 없는 결과를 생성하는 것을 방지할 수 있습니다.
-
입력 데이터의 통계 속성 - 평균, 표준 편차 및 시간 경과에 따른 입력 특성 분포와 같은 통계 속성을 추적하여 데이터 드리프트 또는 이상을 감지합니다. 특성 분포가 기준 훈련 데이터에서 크게 이동하는지 모니터링합니다. 예를 들어 중요한 기능의 평균이 표준 편차 2개를 초과하여 변경되는 경우 데이터 파이프라인이 변경되었는지 또는 기본 데이터 소스가 변경되었는지 조사합니다.
-
데이터 드리프트 감지 및 알림 - 데이터 품질 문제가 훈련에 영향을 미치기 전에 이를 감지하고 경고하는 자동화된 메커니즘을 구현합니다. Kolmogorov-Smirnov 테스트 또는 카이 제곱 테스트와 같은 통계 테스트를 사용하여 현재 데이터 분포를 원래 훈련 데이터와 비교합니다. 테스트에서 상당한 드리프트가 감지되면 알림을 설정하여 업데이트된 데이터로 모델을 재훈련하거나 데이터 파이프라인 문제를 조사할 수 있습니다.
지연 시간 및 처리량 지표
지연 시간 및 처리량 지표를 모니터링하여 훈련 파이프라인의 병목 현상을 식별하고 리소스 사용률을 최적화합니다. 이러한 지표는 훈련 중에 시간이 소비되는 부분과 최적화 작업에 집중할 부분을 이해하는 데 도움이 됩니다.
-
ML 훈련 파이프라인의 End-to-End 지연 시간 - 데이터 수집부터 모델 업데이트까지 전체 훈련 파이프라인을 통해 데이터가 흐르는 총 시간을 측정합니다. 훈련 실행 전반에 걸쳐이 지표를 추적하여 파이프라인 변경으로 성능이 개선되는지 또는 저하되는지 확인합니다. 지연 시간이 길면 노드 간 데이터 로드, 전처리 또는 네트워크 통신의 병목 현상이 발생하는 경우가 많습니다.
-
훈련 처리량 및 처리 속도 - 훈련 파이프라인이 시간 단위당 처리하는 데이터의 양을 추적하여 효율적인 리소스 활용을 보장합니다. 초당 처리된 샘플 또는 분당 완료된 배치와 같은 지표를 모니터링합니다. 하드웨어 용량에 비해 처리량이 낮으면 GPU 주기를 낭비하는 데이터 로드, 전처리 또는 모델 계산의 비효율성을 시사합니다.
-
체크포인트 저장 및 복원 지연 시간 - 작업을 재개하거나 장애로부터 복구할 때 모델 체크포인트를 스토리지(S3, EFS, FSx)에 저장하고 GPU 또는 CPU 메모리에 복원하는 데 필요한 시간을 모니터링합니다. 느린 체크포인트 작업은 작업 복구 시간을 연장하고 비용을 높입니다. 체크포인트 크기, 저장 기간, 복원 기간 및 실패 수를 추적하여 압축 또는 더 빠른 스토리지 계층과 같은 최적화 기회를 식별합니다.
-
데이터 로드 및 사전 처리 시간 - 스토리지에서 데이터를 로드하고 사전 처리 변환을 적용하는 데 소요된 시간을 측정합니다. 이 시간을 모델 계산 시간과 비교하여 훈련이 데이터 바인딩인지 컴퓨팅 바인딩인지 확인합니다. 데이터 로드가 총 훈련 시간의 20% 이상을 소비하는 경우 캐싱, 미리 가져오기 또는 더 빠른 스토리지로 데이터 파이프라인을 최적화하는 것이 좋습니다.
오류 발생률 및 실패
훈련 파이프라인 전체에서 오류율과 실패를 모니터링하여 신뢰성을 유지하고 컴퓨팅 리소스 낭비를 방지합니다. 감지되지 않은 오류로 인해 훈련 작업이 자동으로 실패하거나, 잘못된 모델을 생성하거나, 문제가 발견되기 전에 GPU 시간을 낭비할 수 있습니다.
-
파이프라인 오류 모니터링 - 데이터 사전 처리, 모델 훈련 및 체크포인트 작업을 포함하여 ML 파이프라인의 모든 단계에서 오류를 추적합니다. 오류 유형, 빈도 및 영향을 받는 구성 요소를 로깅하여 문제를 빠르게 식별합니다. 일반적인 오류로는 데이터 형식 불일치, 사전 처리 중 out-of-memory 실패, 스토리지 제한으로 인한 체크포인트 저장 실패 등이 있습니다. 오류 발생률이 기준 임계값을 초과할 때 알림을 설정하여 오류 캐스케이드 전에 조사할 수 있습니다.
-
반복 오류 분석 - 반복 오류의 패턴을 식별 및 조사하여 향후 장애를 방지하고 파이프라인 신뢰성을 개선합니다. 로그를 분석하여 특정 데이터 샘플, 배치 크기 또는 훈련 구성이 일관되게 실패를 유발하는지 확인합니다. 예를 들어 특정 입력 데이터 유형이 사전 처리 오류를 트리거하는 경우 파이프라인 앞부분에서 검증 검사를 추가하거나 데이터 정리 로직을 업데이트합니다. 평균 실패 간격(MTBF)을 추적하여 시간이 지남에 따라 파이프라인 신뢰성이 개선되는지 여부를 측정합니다.”
Kubernetes 및 EKS 특정 지표
Kubernetes 및 EKS 지표를 모니터링하여 클러스터 인프라가 정상 상태를 유지하고 훈련 워크로드를 지원할 수 있는지 확인합니다. 이러한 지표는 훈련 작업 실패 또는 성능 저하를 유발하기 전에 인프라 문제를 감지하는 데 도움이 됩니다.
-
Kubernetes 클러스터 상태 지표 - 포드, 노드, 배포 및 서비스를 포함한 Kubernetes 객체의 상태와 상태를 모니터링합니다. 포드 상태를 추적하여 보류 중, 실패 또는 충돌 루프 상태에 멈춘 포드를 식별합니다. 노드 조건을 모니터링하여 디스크 압력, 메모리 압력 또는 네트워크 사용 불가와 같은 문제를 감지합니다. kubectl 또는 모니터링 도구를 사용하여 이러한 지표를 지속적으로 확인하고 포드가 시작되지 않거나 노드를 예약할 수 없게 되면 알림을 설정합니다.
-
훈련 파이프라인 실행 지표 - 성공 및 실패한 파이프라인 실행, 작업 기간, 단계 완료 시간 및 오케스트레이션 오류를 추적합니다. 훈련 작업이 예상 기간 내에 완료되는지 여부와 시간이 지남에 따라 실패율이 증가하는지 모니터링합니다. 작업 성공률, 평균 작업 기간, 실패까지의 시간과 같은 지표를 추적합니다. 이러한 지표는 인프라 문제, 구성 문제 또는 데이터 품질 문제로 인해 훈련 실패가 발생하는지 식별하는 데 도움이 됩니다.
-
AWS 서비스 지표 - EKS 인프라 및 훈련 워크로드를 지원하는 AWS 서비스에 대한 지표를 추적합니다. 요청 지연 시간, 오류율 및 처리량과 같은 S3 지표를 모니터링하여 데이터 로드 성능이 일관되게 유지되는지 확인합니다. IOPS, 처리량 및 대기열 길이를 포함한 EBS 볼륨 지표를 추적하여 스토리지 병목 현상을 감지합니다. VPC 흐름 로그 및 네트워크 지표를 모니터링하여 노드 간 또는 외부 서비스에 대한 연결 문제를 식별합니다.
-
Kubernetes 컨트롤 플레인 지표 - API 서버, 스케줄러, 컨트롤러 관리자 및 기타 데이터베이스를 모니터링하여 클러스터 작업에 영향을 미치는 성능 문제 또는 장애를 감지합니다. API 서버 요청 지연 시간, 요청 속도 및 오류율을 추적하여 컨트롤 플레인이 예약 요청에 신속하게 응답하도록 합니다. etcd 데이터베이스 크기, 커밋 기간 및 리더 변경 사항을 모니터링하여 안정성 문제를 감지합니다. API 서버 지연 시간이 길거나 etcd 리더를 자주 변경하면 포드 예약이 지연되고 훈련 작업 시작 시간이 연장될 수 있습니다.
애플리케이션 및 인스턴스 로그
애플리케이션 및 인스턴스 로그를 수집하고 분석하여 지표만으로는 설명할 수 없는 문제를 진단합니다. 로그는 오류, 상태 변경 및 시스템 이벤트에 대한 자세한 컨텍스트를 제공하여 훈련 작업이 실패하거나 제대로 수행되지 않는 이유를 이해하는 데 도움이 됩니다. 로그를 지표와 연결하면 근본 원인을 더 빠르게 파악할 수 있습니다.
-
애플리케이션 로그 - 훈련 작업, 데이터 파이프라인 및 ML 프레임워크에서 애플리케이션 로그를 수집하여 병목 현상을 식별하고 장애를 진단합니다. 이러한 로그는 데이터 로드 오류, 모델 초기화 실패, 체크포인트 저장 오류, 프레임워크별 경고 등 작업 실행에 대한 자세한 정보를 캡처합니다. 로그 타임스탬프를 지표 스파이크와 연관시켜 성능 저하 또는 장애의 원인을 파악합니다. 예를 들어 GPU 사용률이 갑자기 감소하는 경우 애플리케이션 로그에서 데이터 파이프라인 중단 또는 사전 처리 실패를 나타내는 오류가 있는지 확인합니다. CloudWatch Logs 또는 Fluent Bit와 같은 중앙 집중식 로깅 도구를 사용하여 모든 포드의 로그를 집계하고 검색할 수 있도록 합니다.
-
인스턴스 로그 - 시스템 저널 로그 및 dmesg 출력과 같은 인스턴스 수준 로그를 수집하여 하드웨어 문제 및 커널 수준 문제를 감지합니다. 이러한 로그는 GPU 드라이버 오류, 메모리 할당 실패, 디스크 I/O 오류, 애플리케이션 로그에 나타나지 않을 수 있는 네트워크 인터페이스 문제와 같은 문제를 보여줍니다. 인스턴스 로그를 애플리케이션 로그 및 지표와 연관시켜 훈련 실패가 하드웨어 문제 또는 애플리케이션 문제로 인한 것인지 확인합니다. 예를 들어 out-of-memory 오류로 인해 훈련 작업이 실패하는 경우 시스템에서 메모리가 부족했는지 또는 애플리케이션이 컨테이너 제한을 초과했는지 여부를 나타내는 커널 OOM 킬러 메시지가 있는지 dmesg 로그를 확인합니다. GPU XID 오류 또는 디스크 장애와 같은 중요한 하드웨어 오류에 대한 알림을 설정하여 장애가 발생한 인스턴스가 광범위한 훈련 중단을 일으키기 전에 교체할 수 있습니다.
다음 섹션에서는 CloudWatch Container Insights 및 Amazon Managed Prometheus와 Amazon Managed Grafana의 두 가지 AWS 권장 접근 방식을 사용하여 위에서 설명한 지표를 수집하는 방법을 보여줍니다. 최소한의 설정 및 사전 구축된 대시보드로 AWS 네이티브 도구를 선호하는 경우 CloudWatch Container Insights를 선택합니다. 사용자 지정 대시보드, 고급 시각화 기능이 필요하거나 기존 Prometheus 기반 모니터링 인프라와 통합하려는 경우 Amazon Managed Grafana에서 Amazon Managed Prometheus를 선택합니다. 사용 가능한 Container Insights 지표의 전체 목록은 Amazon EKS 및 Kubernetes Container Insights 지표를 참조하세요.
실시간 온라인 추론 지표 모니터링 고려
실시간 시스템에서는 사용자 또는 기타 종속 시스템에 적시에 응답을 제공하려면 짧은 지연 시간이 중요합니다. 지연 시간이 길면 사용자 경험이 저하되거나 성능 요구 사항을 위반할 수 있습니다. 추론 지연 시간에 영향을 미치는 구성 요소에는 모델 로드 시간, 사전 처리 시간, 실제 예측 시간, 사후 처리 시간, 네트워크 전송 시간이 포함됩니다. 추론 지연 시간을 모니터링하여 서비스 수준 계약(SLAs)을 충족하는 지연 시간이 짧은 응답을 보장하고 다음에 대한 사용자 지정 지표를 개발하는 것이 좋습니다. 예상 로드 상태에서 테스트하고, 네트워크 지연 시간을 포함하고, 동시 요청을 고려하고, 다양한 배치 크기로 테스트합니다.
-
첫 번째 토큰까지의 시간(TTFT) - 사용자가 요청을 제출한 시점부터 응답의 시작(첫 번째 단어, 토큰 또는 청크)을 수신할 때까지의 시간입니다. 예를 들어 챗봇에서는 사용자가 질문을 한 후 첫 번째 출력(토큰)을 생성하는 데 걸리는 시간을 확인합니다.
-
End-to-End 지연 시간 - 요청이 수신된 시점부터 응답이 다시 전송된 시점까지의 총 시간입니다. 예를 들어 요청에서 응답까지의 시간을 측정합니다.
-
초당 출력 토큰(TPS) - 모델이 응답을 시작한 후 새 토큰을 생성하는 속도를 나타냅니다. 예를 들어 챗봇에서는 기준 텍스트에 대한 언어 모델의 생성 속도를 추적합니다.
-
오류율 - 성능 문제를 나타낼 수 있는 실패한 요청을 추적합니다. 예를 들어 대용량 문서 또는 특정 문자에 대한 실패한 요청을 모니터링합니다.
-
처리량 - 시스템이 시간 단위당 처리할 수 있는 요청 또는 작업 수를 측정합니다. 예를 들어 최대 부하를 처리하기 위해 초당 요청을 추적합니다.
K/V(Key/Value) 캐시는 추론 지연 시간, 특히 변환기 기반 모델과 관련된 강력한 최적화 기술일 수 있습니다. K/V 캐시는 이전 변환기 계층 계산의 키 및 값 텐서를 저장하여 자동 회귀 추론, 특히 대규모 언어 모델(LLMs)에서 중복 계산을 줄입니다. 캐시 효율성 지표(특히 K/V 또는 세션 캐시 사용):
-
캐시 적중률/누락률 - 캐싱(K/V 또는 캐시 임베딩)을 활용하는 추론 설정의 경우 캐시가 얼마나 자주 도움이 되는지 측정합니다. 낮은 적중률은 최적화되지 않은 캐시 구성 또는 워크로드 변경을 나타낼 수 있으며, 둘 다 지연 시간을 증가시킬 수 있습니다.
이후 주제에서는 위에서 언급한 몇 가지 지표에 대한 데이터 수집을 보여줍니다. AWS 네이티브 CloudWatch Container Insights와 Amazon Managed Grafana를 사용하는 오픈 소스 Amazon Managed Prometheus라는 두 가지 AWS 권장 접근 방식이 포함된 예제를 제공합니다. https://docs.aws.amazon.com/grafana/latest/userguide/getting-started-with-AMG.html 전반적인 관찰성 요구 사항에 따라 이러한 솔루션 중 하나를 선택합니다. Container Insights 지표의 전체 목록은 Amazon EKS 및 Kubernetes Container Insights 지표를 참조하세요.
GPU 메모리 사용량 추적
코어 훈련 모니터링 및 지표 미세 조정 고려 주제에서 설명한 것처럼 out-of-memory(OOM) 오류를 방지하고 효율적인 리소스 사용률을 보장하려면 GPU 메모리 사용이 필수적입니다. 다음 예제에서는 사용자 지정 히스토그램 지표를 노출하도록 훈련 애플리케이션을 계측gpu_memory_usage_bytes하고 P95 메모리 사용량을 계산하여 최대 소비를 식별하는 방법을 보여줍니다. 스테이징 환경에서 샘플 훈련 작업(예: 변환기 모델 미세 조정)을 사용하여 테스트해야 합니다.
AWS-Native CloudWatch Container Insights 예제
이 샘플은 AWS 네이티브 접근 방식을 사용하여 훈련 애플리케이션을 히스토그램gpu_memory_usage_bytes으로 노출하도록 계측하는 방법을 보여줍니다. CloudWatch 임베디드 지표 형식(EMF) 형식으로 구조화된 로그를 내보내도록 AI/ML 컨테이너를 구성해야 합니다. CloudWatch 로그는 EMF를 구문 분석하고 지표를 게시합니다. 훈련 애플리케이션에서 aws_embedded_metrics
from aws_embedded_metrics import metric_scope import torch import numpy as np memory_usage = [] @metric_scope def log_gpu_memory(metrics): # Record current GPU memory usage mem = torch.cuda.memory_allocated() memory_usage.append(mem) # Log as histogram metric metrics.set_namespace("MLTraining/GPUMemory") metrics.put_metric("gpu_memory_usage_bytes", mem, "Bytes", "Histogram") # Calculate and log P95 if we have enough data points if len(memory_usage) >= 10: p95 = np.percentile(memory_usage, 95) metrics.put_metric("gpu_memory_p95_bytes", p95, "Bytes") print(f"Current memory: {mem} bytes, P95: {p95} bytes") # Example usage in training loop for epoch in range(20): # Your model training code would go here log_gpu_memory()
Prometheus 및 Grafana 예제
이 샘플은 Python의 Prometheus 클라이언트 라이브러리를 사용하여 훈련 애플리케이션을 히스토그램gpu_memory_usage_bytes`으로 노출하도록 계측하는 방법을 보여줍니다.
from prometheus_client import Histogram from prometheus_client import start_http_server import pynvml start_http_server(8080) memory_usage = Histogram( 'gpu_memory_usage_bytes', 'GPU memory usage during training', ['gpu_index'], buckets=[1e9, 2e9, 4e9, 8e9, 16e9, 32e9] ) # Function to get GPU memory usage def get_gpu_memory_usage(): if torch.cuda.is_available(): # Get the current GPU device device = torch.cuda.current_device() # Get memory usage in bytes memory_allocated = torch.cuda.memory_allocated(device) memory_reserved = torch.cuda.memory_reserved(device) # Total memory usage (allocated + reserved) total_memory = memory_allocated + memory_reserved return device, total_memory else: return None, 0 # Get GPU memory usage gpu_index, memory_used = get_gpu_memory_usage()
실시간 온라인 추론에 대한 추론 요청 기간 추적
코어 훈련 모니터링 및 지표 미세 조정 고려 주제에서 설명한 것처럼 사용자 또는 기타 종속 시스템에 적시에 응답을 제공하려면 지연 시간이 짧아야 합니다. 다음 예제에서는 추론 애플리케이션에서 inference_request_duration_seconds노출된 사용자 지정 히스토그램 지표를 추적하는 방법을 보여줍니다. 최악의 시나리오에 초점을 맞추기 위해 95번째 백분위수(P95) 지연 시간을 계산하고, 스테이징 환경에서 합성 추론 요청(예: Locust를 통해)으로 테스트하고, SLA 위반을 감지하기 위해 알림 임계값(예: >500ms)을 설정합니다.
AWS-Native CloudWatch Container Insights 예제
이 샘플은 AWS CloudWatch 임베디드 지표 형식을 사용하여 추론 애플리케이션에서 추론_request_duration_seconds에 대한 사용자 지정 히스토그램 지표를 생성하는 방법을 보여줍니다.
import boto3 import time from aws_embedded_metrics import metric_scope, MetricsLogger cloudwatch = boto3.client('cloudwatch') @metric_scope def log_inference_duration(metrics: MetricsLogger, duration: float): metrics.set_namespace("ML/Inference") metrics.put_metric("inference_request_duration_seconds", duration, "Seconds", "Histogram") metrics.set_property("Buckets", [0.1, 0.5, 1, 2, 5]) @metric_scope def process_inference_request(metrics: MetricsLogger): start_time = time.time() # Your inference processing code here # For example: # result = model.predict(input_data) duration = time.time() - start_time log_inference_duration(metrics, duration) print(f"Inference request processed in {duration} seconds") # Example usage process_inference_request()
Prometheus 및 Grafana 예제
이 샘플은 Python의 Prometheus 클라이언트 라이브러리를 사용하여 추론 애플리케이션에서 추론_request_duration_seconds에 대한 사용자 지정 히스토그램 지표를 생성하는 방법을 보여줍니다.
from prometheus_client import Histogram from prometheus_client import start_http_server import time start_http_server(8080) request_duration = Histogram( 'inference_request_duration_seconds', 'Inference request latency', buckets=[0.1, 0.5, 1, 2, 5] ) start_time = time.time() # Process inference request request_duration.observe(time.time() - start_time)
Grafana에서 쿼리를 사용하여 P95 지연 시간 추세histogram_quantile(0.95, sum(rate(inference_request_duration_seconds_bucket[5m])) by (le, pod))를 시각화합니다. 자세한 내용은 Prometheus 히스토그램 설명서
실시간 온라인 추론을 위한 토큰 처리량 추적
코어 훈련 모니터링 및 지표 미세 조정 고려 주제에서 설명한 대로 토큰 처리 시간을 모니터링하여 모델 성능을 측정하고 조정 결정을 최적화하는 것이 좋습니다. 다음 예제에서는 추론 애플리케이션에서 노출되는 사용자 지정 히스토그램 지표 token_processing_duration_seconds를 추적하는 방법을 보여줍니다. 95번째 백분위수(P95) 지속 시간을 계산하여 처리 효율성을 분석하고, 비프로덕션 클러스터에서 시뮬레이션된 요청 로드(예: 초당 100~1,000개의 요청)로 테스트하고, 조정을 최적화하도록 KEDA 트리거를 조정합니다.
AWS-Native CloudWatch Container Insights 예제
이 샘플은 AWS CloudWatch 임베디드 지표 형식을 사용하여 token_processing_duration_seconds에 대한 추론 애플리케이션에서 사용자 지정 히스토그램 지표를 생성하는 방법을 보여줍니다. 차원(`set_dimension) with a custom `get_duration_bucket 함수를 사용하여 기간을 버킷으로 분류합니다(예: """0.01", ">1").
import boto3 import time from aws_embedded_metrics import metric_scope, MetricsLogger cloudwatch = boto3.client('cloudwatch') @metric_scope def log_token_processing(metrics: MetricsLogger, duration: float, token_count: int): metrics.set_namespace("ML/TokenProcessing") metrics.put_metric("token_processing_duration_seconds", duration, "Seconds") metrics.set_dimension("ProcessingBucket", get_duration_bucket(duration)) metrics.set_property("TokenCount", token_count) def get_duration_bucket(duration): buckets = [0.01, 0.05, 0.1, 0.5, 1] for bucket in buckets: if duration <= bucket: return f"<={bucket}" return f">{buckets[-1]}" @metric_scope def process_tokens(input_text: str, model, tokenizer, metrics: MetricsLogger): tokens = tokenizer.encode(input_text) token_count = len(tokens) start_time = time.time() # Process tokens (replace with your actual processing logic) output = model(tokens) duration = time.time() - start_time log_token_processing(metrics, duration, token_count) print(f"Processed {token_count} tokens in {duration} seconds") return output
Prometheus 및 Grafana 예제
이 샘플은 Python의 Prometheus 클라이언트 라이브러리를 사용하여 token_processing_duration_seconds에 대한 추론 애플리케이션에서 사용자 지정 히스토그램 지표를 생성하는 방법을 보여줍니다.
from prometheus_client import Histogram from prometheus_client import start_http_server import time start_http_server(8080) token_duration = Histogram( 'token_processing_duration_seconds', 'Token processing time per request', buckets=[0.01, 0.05, 0.1, 0.5, 1] ) start_time = time.time() # Process tokens token_duration.observe(time.time() - start_time)
Grafana에서 쿼리를 사용하여 P95 처리 시간 추세histogram_quantile(0.95, sum(rate(token_processing_duration_seconds_bucket[5m])) by (le, pod))`를 시각화합니다. 자세한 내용은 Prometheus 히스토그램 설명서
체크포인트 복원 지연 시간 측정
코어 훈련 모니터링 및 지표 미세 조정 고려 주제에서 설명한 것처럼 체크포인트 지연 시간은 모델 수명 주기의 여러 단계에서 중요한 지표입니다. 다음 예제에서는 애플리케이션에서 checkpoint_restore_duration_seconds`노출되는 사용자 지정 히스토그램 지표를 추적하는 방법을 보여줍니다. 95번째 백분위수(P95) 지속 시간을 계산하여 복원 성능을 모니터링하고, 비프로덕션 클러스터에서 스팟 중단을 테스트하고, 알림 임계값(예: <30초)을 설정하여 지연을 감지합니다.
AWS-Native CloudWatch Container Insights 예제
이 샘플은 CloudWatch Insights를 사용하여 checkpoint_restore_duration_seconds를 히스토그램으로 노출하도록 배치 애플리케이션을 계측하는 방법을 보여줍니다.
import boto3 import time import torch from aws_embedded_metrics import metric_scope, MetricsLogger @metric_scope def log_checkpoint_restore(metrics: MetricsLogger, duration: float): metrics.set_namespace("ML/ModelOperations") metrics.put_metric("checkpoint_restore_duration_seconds", duration, "Seconds", "Histogram") metrics.set_property("Buckets", [1, 5, 10, 30, 60]) metrics.set_property("CheckpointSource", "s3://my-bucket/checkpoint.pt") @metric_scope def load_checkpoint(model, checkpoint_path: str, metrics: MetricsLogger): start_time = time.time() # Load model checkpoint model.load_state_dict(torch.load(checkpoint_path)) duration = time.time() - start_time log_checkpoint_restore(metrics, duration) print(f"Checkpoint restored in {duration} seconds")
Prometheus 및 Grafana 예제
이 샘플은 Python의 Prometheus 클라이언트 라이브러리를 사용하여 배치 애플리케이션을 히스토그램checkpoint_restore_duration_seconds으로 노출하도록 계측하는 방법을 보여줍니다.
from prometheus_client import Histogram from prometheus_client import start_http_server import torch start_http_server(8080) restore_duration = Histogram( 'checkpoint_restore_duration_seconds', 'Time to restore checkpoint', buckets=[1, 5, 10, 30, 60] ) with restore_duration.time(): model.load_state_dict(torch.load("s3://my-bucket/checkpoint.pt"))
Grafana에서 쿼리를 사용하여 P95 복원 지연 시간 추세histogram_quantile(0.95, sum(rate(checkpoint_restore_duration_seconds_bucket[5m]) by (le))를 시각화합니다. 자세한 내용은 Prometheus 히스토그램 설명서