Latest / M365.FM – Microsoft 365, Copilot & AI 팟캐스트 (한국어) / 느린 GPU 추론의 진짜 원인: CPU 폴백, CUDA/TensorRT 버전 충돌, 컨테이너 설정 오류 해결 (AI 더빙)
Transcript
- 0:00경고 메시지가 뜨더니 그 후로는 아무 소식이 없었습니다.
- 0:02gpu 사용료는 가속기가 실세 없이 작동하는 것처럼 치솟았지만
- 0:05출력은 마치 불이 꺼진 것처럼 느려졌습니다.
- 0:07대시보드는 정상이었지만 고객들은 불편을 겪었습니다.
- 0:10뭔가 이상했습니다.
- 0:11gpu 사용료는 거의 0에 가까운데 지연 시간은 급증했습니다.
- 0:15경고도 위험 신호도 없이 시간은 그저 흘러갈 뿐이었습니다.
- 0:18모든 정황은 정상처럼 위장한 하나의 병리 현상을 시사합니다.
- 0:22이제 약속드립니다.
- 0:23우리는 원인을 추적하고 범인을 밝혀내고 병리 현상을 해결할 것입니다.
- 0:27cpu 풀백, coda와 onnx 텐소르 버전 불일치, 컨테이너 구성 오류라는
- 0:32세 가지 오류 유형을 분석하고 해결 전후의 지연 시간, 처리량,
- 0:36gpu 사용률을 통해 이를 입증할 것입니다.
- 0:38사례 설정, 환경, 그리고 피해자 프로필, 모든 구성에는 이야기가 담겨 있으며
- 0:43이 이야기는 압박을 받는 평범한 테넌트에서 시작됩니다.
- 0:46이 워크로드는 텍스트 이미지 확산 처리이며 안정적인 확산 변형은
- 0:50512x512 해상도에서 실행되고 1024x1024까지 확장 가능합니다.
- 0:54트래픽은 버스트 형태로 발생하며 동시 요청수는 8에서 32개입니다.
- 0:58배치 크기는 1에서 8개로 유동적입니다.
- 1:00서비스 수준은 테일 레이턴시에 매우 영격하며
- 1:02p95점수 미달시 크레딧 및 페널티가 직접적으로 복과됩니다.
- 1:05사용된 모델은 특별히 독창적이지는 않지만 모델 선택이 매우 중요합니다.
- 1:08onnx는 안정적인 확산 파이프 라인,
- 1:10x포머즈 또는 스케일드 도트 프로덕트 어텐션과 같은 크로스 어텐션 최적화,
- 1:14그리고 처리 단계수를 줄이는 대신 품질을 우선시하는 스케줄러 선택 기술을 개발했습니다.
- 1:16이러한 생태계는 기반 시설이 제대로 구축되었을 때 가속화될 것으로 기대됩니다.
- 1:20하드웨어 사양은 스펙상으로는 훌륭합니다.
- 1:23클라우드 환경에서는 엔비디아 RTX 및 A 시리즈 그래픽카드가 16에서 32GB 위 VRAM을 제공합니다.
- 1:27호스트와 디바이스 사이에는 PCIe 슬롯이 마치 통행료 징수처럼 자리잡고 있습니다.
- 1:30제대로 구성되었을 때는 충분히 빠르지만,
- 1:32아이오 바인딩이 페이징 전송으로 전환될 때는 성능 저하를 초래합니다.
- 1:34이러한 환경에서는 모든 것이 위도적으로 결정됩니다.
- 1:36툴체인은 익숙한 계층 구조로 이루어져 있습니다.
- 1:38파이토치는 내보내기에 사용되고,
- 1:40ONNX 런타임 또는 텐소르가 추론을 담당합니다.
- 1:42CUDA 드라이버는 모든 것의 하위 계층에 위치합니다.
- 1:45어텐션 커널은 버전이 일치하면 빠른 속도를 제공합니다.
- 1:48배포는 연격하게 컨테이너화 되고,
- 1:49이미지는 변경 불가능하며,
- 1:50CI로 제어되는 롤아웃 방식과 정책에 따른 블루, 그린 배포 방식을 따릅니다.
- 1:53이러한 제약 조건은 안전성을 확보하는 동시에 결함을 조기에 발견하여 숨길 수 있도록 합니다.
- 1:57비즈니스적 이해관계는 추상적이지 않습니다.
- 1:59요청당 비용이 마진을 결정합니다.
- 2:01GPU 예약은 커널 실행 여부와 관계없이 시간 단위로 요금이 부과됩니다.
- 2:05지연 시간이 몇 초에서 30초로 늘어나면 처리량이 급격히 감소합니다.
- 2:08구성 오류 하나만으로도 가속기가 과부하 상태로 작동하여 비용이 많이 들고,
- 2:12아무런 작업도 하지 않고 대기열 처리에 아무런 도움이 되지 않습니다.
- 2:14자세히 살펴보면 문제의 원인은 명확해집니다.
- 2:17동시 실행수는 16개, 배치 처리수는 2개로 설정하여 512개의 GPU에서 VRM 상한선을 준수하고,
- 2:22품질 향상을 위해 2025개로 단계적으로 늘립니다.
- 2:24페넌트는 일관된 P95 점수를 기대합니다.
- 2:27하지만 트레이스 데이터는 불규칙적인 지연시간, P50과 P95 사이의 큰 차이,
- 2:31그리고 명확한 이유 없이 5%에서 40% 사이를 오르락 내리락하는 GPU 듀티 사이클을 보여줍니다.
- 2:36CPU 그래프는 다른 진실을 드러냅니다.
- 2:38전처리 작업이 없는데도 코어 사용률이 최고치에 달하는 현상이 나타납니다.
- 2:41이러한 현상은 3가지 가능성을 시사합니다.
- 2:43첫째, CPU 폴백입니다.
- 2:45CUDA 또는 텐소르 실행 공급자가 로드되지 않으면 엔진은 조용히 CPU 그래프를 선택합니다.
- 2:50모델은 작동하지만 지연시간이 10에서 30배 증가합니다.
- 2:53둘째, 버전 불일치입니다.
- 2:54ONNX 런타임이 특정 CUDA 버전을 기준으로 컴파일되었는데 노드에서는 다른 버전을 실행하고 있고,
- 2:59펜소르 엔진은 무효화되고 일반 커널로 다시 빌드된 경우입니다.
- 3:02사용률은 나타나지만 빠른 경로가 사라집니다.
- 3:05셋째, 컨테이너 구성 오류, 과도하게 큰 이미지, GPU 장치 마운트 누락,
- 3:10잘못된 엔비디아 컨테이너 툴킷 설정,
- 3:12그리고 부하시 지연시간을 증폭시키는 메모리 영역 할당 문제입니다.
- 3:16결국, 이는 모델에 대한 미스터리가 아니라 인프라의 정확성에 대한 문제입니다.
- 3:20우리는 아티팩트, 공급자 순서, 기능 로그, 장치 마운트를 추적하고,
- 3:24이를 세 가지 확실한 지표인 지연시간, 처리량 및 GPU 사용률과 연관시킬 것입니다.
- 3:31증거 파일 A, CPU 풀백, 조용한 방해꾼,
- 3:35몇 초면 충분해야 할 요청이 그렇지 않으면 서문제가 시작되었습니다.
- 3:39GPU 미터는 너무 조용했습니다.
- 3:41반면 CPU 그래프는 화재 경보처럼 치솟았습니다.
- 3:43자세히 살펴보니 엔진이 선택을 했습니다.
- 3:46GPU 비용이 드는 작업을 CPU에서 실행한 것입니다.
- 3:48경고는 발생하지 않았습니다.
- 3:50결국 출력은 반환되었습니다.
- 3:51이것이 바로 조용한 방해꾼, CPU 풀백입니다.
- 3:54왜 중요한지는 간단합니다.
- 3:55CPU에서의 안정적인 확산은 시간 동기화입니다.
- 3:58모델은 작동하지만 지연시간이 10에서 30배 느려지고,
- 4:01처리량이 급격히 떨어집니다.
- 4:02밀리초 단위로 판매되는 환경에서는 이러한 차이가 치명적입니다.
- 4:06비용은 계속 GPU 시간을 계산하지만,
- 4:07장치는 작업을 수행하지 않습니다.
- 4:09타임라인을 통해 패턴이 드러났습니다.
- 4:10CUDA를 사용하여 로컬에서 실행된 컨테이너는 매우 빠르게 작동했습니다.
- 4:13약간 다른 드라이버 스택을 사용하는 클러스터 노드에 배포했는데,
- 4:16동일한 컨테이너들이 부팅되고 상태 프로브를 제공한 후 상태가 저하되었습니다.
- 4:20상태 엔드포인트는 서버가 작동 중인지만 확인했을 뿐,
- 4:22GPU가 실제로 실행 중인지는 확인하지 않았습니다.
- 4:25이런 환경에서는 모든 것이 위도적으로 발생합니다.
- 4:27아무런 경고도 없습니다.
- 4:29핵심적인 원인은 ONNX 런타임의 실행 공급자 순서입니다.
- 4:33엔진은 목록을 받아서 텐소를, CUDA, CPU 순으로 시도합니다.
- 4:37CUDA 초기화에 실패하면 잘못된 드라이버, 누락된 라이브러리, 장치 마운트 실패 등,
- 4:42ORT는 조용히 CPU 실행 공급자들 사용합니다.
- 4:44예외도, 크래시도 발생하지 않고 로그에 한 줄만 남습니다.
- 4:47그것도 눈에 잘 띄지 않는 곳에 말이죠.
- 4:48CUDA 실행 공급자들 사용할 수 없습니다.
- 4:50CPU로 전환합니다.
- 4:52이 줄은 대부분의 팀이 익지 않는 고백과 같습니다.
- 4:54이상한 점은 사용률 차트가 처음에는 정상적으로 보인다는 것입니다.
- 4:58요청은 여전히 완료되고, 서비스 맵도 녹색으로 표시되지만,
- 5:01GPU 듀티 사이클은 5%에 머무르는 반면 CPU 사용자 시간은 높게 유지됩니다.
- 5:06P50 지연 시간은 4배로 증가하고, P95는 무너집니다.
- 5:09트래픽이 급증하면 상황은 더욱 악화됩니다.
- 5:11Q가 쌓이고 자동 스케일링으로 인해 복제본이 늘어나는데,
- 5:14이 복제본들은 모두 동일한 결함을 물려받습니다.
- 5:15마치 릴레이 경주에서 단거리 선수가 나타나지 않아 사서가 대신 뛰는 것과 같습니다.
- 5:19바통은 움직이지만 경주 속도로는 움직이지 않습니다.
- 5:21다시 말해, 시스템은 전체 SLO 예산을 희생하면서 정확성을 제공합니다.
- 5:26부팅 시퀀스를 추적하면 오류가 빠르게 누적됩니다.
- 5:28공급자로드 로그에는 드라이버 버전 확인과 함께 CUDA 초기화 시도가 표시됩니다.
- 5:36노드의 12버전만 있는 경우 초기화가 실패합니다.
- 5:39엔비디아 컨테이너 툴킷이 구성되지 않은 경우 컨테이너 내부에 장치 마운트가 나타나지 않습니다.
- 5:44데브, 엔비디아도 없고 리브쿠다도 없습니다.
- 5:47따라서 팟 사양에서 GPU를 명시적으로 요청하지 않으면 스케줄러는 장치를 할당하지 않습니다.
- 5:52이러한 문제 중 하나라도 발생하면 조용한 다운그레이드가 발생합니다.
- 5:55재현은 간단합니다.
- 5:57잘못 구성된 노드에서 간단한 추론을 실행하면 예상되는 텐서 RT 실행 공급자,
- 6:02CUDA 실행 공급자 대신 공급자, CPU 실행 공급자가 출력됩니다.
- 6:07워쿰프 12 프롬프트 하나를 누르면 GPU는 유유 상태로 유지됩니다.
- 6:10CPU 스레드 사용량이 급증하고 이미지 반환 시간이 2에서 6초가 아닌 20에서 40초로 늘어납니다.
- 6:15적절한 드라이버와 마운트가 설치된 노드에서 동일한 프롬프트를 실행하면 훨씬 짧은 시간 안에 완료되고 GPU 듀티의 사이클이 안정적인 범위로 상승합니다.
- 6:22이러한 증거는 현재의 안전장치가 형식적인 것에 불과함을 시사합니다.
- 6:25서버가 응답하기 때문에 상태 프로브는 200을 반환합니다.
- 6:28GPU 경로가 활성화되었는지 확인하는 시작 검증이 없습니다.
- 6:31성능 프로브가 존재하지 않으므로 오케스트레이션은 복제본이 정상이라고 판단합니다.
- 6:35시스템은 가속과 에뮬레이션을 구분할 수 없습니다.
- 6:38대응책은 설계상 투박합니다.
- 6:40GPU 실행 공급자가 없거나 성능이 저하된 경우 하드 실패를 발생시켜야 합니다.
- 6:44프로덕션 환경에서는 CPU로 시작하지 않도록 해야 합니다.
- 6:47프로세스 시작 시 공급자들 열거하고 텐서 RT 또는 CUDA 가로드 되었는지,
- 6:51장치수가 예상과 일치하는지 검증해야 합니다.
- 6:53기능 세트, QD에는 사용 가능한 텐서 코어,
- 6:57메모리 제한을 로그에 기록하고 누락된 항목이 있으면 0이 아닌 종료 코드를 반환해야 합니다.
- 7:01가용성을 희생하더라도 무결성을 유지하고,
- 7:03오케스트레이터가 정상적인 노드에서 재스케줄링 하도록 합니다.
- 7:05이를 유지하기 위해 IO 바인딩 검증을 강제합니다.
- 7:08입력과 출력을 장치 메모리에 바인딩하고 시작 시 간단한 추론을 검증합니다.
- 7:12융합된 어텐션 커널을 테스트하는 워밍업 실행을 한 번 수행합니다.
- 7:16타이밍이 지연 시간 기준을 초과하면 성능 저하 경로로 간주하고 파드를 실패 처리합니다.
- 7:20결정 론적 시드를 사용하는 카나리 프롬프트 세트를 추가합니다.
- 7:23지연 시간을 기준선 기간과 비교합니다.
- 7:25편차가 허용치를 초과하면 프로덕션을 중단하고 배포를 중지합니다.
- 7:29이는 다소 가혹해 보일 수 있지만 대안은 더 나쁩니다.
- 7:32시간과 예산을 낭비하면서 작동하는 클러스터를 만드는 것입니다.
- 7:35공급자 순서를 고정하고 CPU 폴백을 거부하며 시스템이 작동 중임을 입증하기 전에는 활성 상태로 간주하지 않습니다.
- 7:41그래야만 녹색 표시가 가속을 의미합니다.
- 7:43증거 파일 B, 버전 불일치, CUDA, ONNX, 텐소르 B 호환성, GPU가 사용되지 않은 경우 GPU가 존재하더라도 최대 속도로 작동할 수 있는지 여부가 다음 질문입니다.
- 7:54증거는 더 미묘한 오류를 시사합니다.
- 7:56버전은 실행될 만큼 일치하지만 고속 경로를 활성화할 만큼은 일치하지 않습니다.
- 7:59시스템이 가속화된 것처럼 보이지만 클럽을 자세히 살펴보면 그렇지 않다는 것을 알게 됩니다.
- 8:03왜 이것이 중요한지는 간단합니다.
- 8:05확산 파이프라인은 어텐션 성능에 따라 성패가 좌우됩니다.
- 8:07ONNX 런타임과 텐소르가 CUDA, CON 또는 텐소르 버전이 일치하지 않아 예상하는 커널을 로드하거나 융합할 수 없는 경우 조용히 일반 구현으로 전환됩니다.
- 8:17모델은 작동하지만 사용률은 30에서 50% 수준을 유지하고 지연시간은 예산을 초과합니다.
- 8:24빌드는 동일해 보이지만 작업 속도는 느려집니다.
- 8:27자세히 살펴보면 결과는 정확합니다.
- 8:29공급자 로드 로그에는 성공 메시지가 표시됩니다.
- 8:32기본 커널로 되돌아가거나 X포머즈가 비활성화된 것입니다.
- 8:35호환되지 않는 엔진 재구축으로 인해 텐소르 플랜 역 직렬화가 실패하고 노든의 컴파일이 트리거되는 것을 볼 수 있습니다.
- 8:42특정 마이너 버전의 텐소르에서 빌드된 엔진은 다른 마이너 버전에서 역 직렬화되지 않습니다.
- 8:46재구축은 완료되지만 결과 플랜에서 융합 어텐션이나 FP16 최적화가 누락될 수 있습니다.
- 8:51이렇게 경쟁이 종료되고 급격한 사용량 급증 없이 텐서 코어 듀티 사이클은 안정적으로 유지됩니다.
- 8:55여기서 직관에 반하는 부분이 나옵니다.
- 8:57팀들은 이 시스템이 최적의 상태로 실행된다고 해석합니다.
- 9:00하지만 이 환경에서는 모든 것이 우연이 아닙니다.
- 9:03스컬리드 프로덕트 어텐션이 활성화되어 있지 않거나 엑스포머즈 가꿔져 있거나 컨이 작업 공간이 제한적이라고 보고하면 성능이 급격히 저하됩니다.
- 9:10간단히 말해 바이너리가 일치하지 않으면 네모리 이동량이 많고 연산 밀도가 낮은 커널이 사용되기 때문입니다.
- 9:15PCI 이 관련 문제가 트레이스에서 드러나게 됩니다.
- 9:18동시성이 증가함에 따라 테일 레이턴시가 변동합니다.
- 9:20스택을 자물쇠 세트라고 생각해보세요.
- 9:22드라이버, CUDA 툴킷, CON, ONNX 런타임 빌드 플래그, 그리고 텐소르가 있습니다.
- 9:28자물쇠의 톱니 하나라도 어긋나 면 열쇠가 반만 돌아갑니다.
- 9:31ORT는 실행 공급자별로 기능 그래프를 제공합니다.
- 9:34컴파일된 ORT가 CUDA 12.1을 예상하지만 노드 드라이버가 12.1을 제공하는 경우 CUDA는 제한된 기능으로 로드되거나 아예 로드되지 않습니다.
- 9:42노드에서 텐소르가 8.6인데 실행 계획이 8.4로 생성된 경우 역직렬화가 실패하고 보수적 인 방식으로 다시 생성됩니다.
- 9:49이 시스템은 속도보다 정확성을 우선시하며 그로 인한 실질적인 손실이 벤치마크를 통해 입증됩니다.
- 9:55X포머즈 또는 SDP가 활성화된 경우 확산 어텐션은 실제 처리 시간을 현저하게 단축합니다.
- 10:00연구 결과는 해상도와 배치 크기에 따라 어텐션 경로에서 최대 2에서 5배의 속도 향상이 일관되게 나타남을 보여줍니다.
- 10:05버전 변경으로 인해 이러한 기능을 비활성화하면 해당 속도 향상 효과를 잃게 됩니다.
- 10:09토큰 병합, 톰은 이러한 속도 향상과 함께 작동합니다.
- 10:12융합 커널이 없으면 메모리 대역폭과 최적화되지 않은 레이아웃으로 인해 이점이 제한됩니다.
- 10:171024x1024 이하의 동시 처리 환경에서는 이러한 격차가 더욱 커집니다.
- 10:21이러한 문제의 원인을 추적하려면 먼저 기능열거, 케퍼빌리티 이뉴머레이션 부터 시작하십시오.
- 10:25시작 시 정확한 공급자 목록과 보고된 기능을 출력하십시오.
- 10:28텐소르 버전, FP16 및 INTA 사용 가능 여부, 최대 작업 공간, 컨컨볼 루션 휴리스틱, 멀티 GPU용 NCCL 존재 여부 등을 확인하십시오.
- 10:38ONNX 런타임의 경우 EP 우선 순위를 출력하십시오.
- 10:41텐소르, CUDA, CPU 순으로 출력합니다.
- 10:44어떤 공급자가 실제로 그래프 노드에 바인딩 되는지 확인하십시오.
- 10:47텐소르가 융합커널을 사용하는 텐소르에 할당되었는지 또는 일반 CUDA 커널에 할당되었는지 여부를 로그에 기록합니다.
- 10:52다음으로 환경을 조사합니다.
- 10:54드라이버를 커리합니다.
- 10:55엔비디아 SMI는 커널 모듈과 CUDA 호환성을 보여줍니다.
- 10:58컨테이너의 라이브러리 버전을 읽습니다.
- 11:00리브쿠다, 리브커블라스, 리브컨, 리븐빔퍼 등을 확인합니다.
- 11:04이미지에 CUDA 12.3 라이브러리가 포함되어 있지만 호스트 드라이버가 최대 12.2까지만 지원하는 경우 런타임 호환 모드가 제약 조건과 함께 로드될 수 있습니다.
- 11:11이미지가 텐소르 8.6 헤더를 예상하지만 노드 플러그인이 8.4를 제공하는 경우 API 호출 성능이 저하되거나 특정 최적화가 무효화될 수 있습니다.
- 11:18해결책은 단순한 희망사항이 아니라 빌드 매트릭스를 사용하는 것입니다.
- 11:21단일 소스에서 정확한 버전을 고정합니다.
- 11:24드라이버 호환성, CUDA 마이너 버전, 헌, YT 빌드 해시 및 텐소르 버전을 포함하는 기본 이미지를 만듭니다.
- 11:30해당 매트릭스를 기반으로 추론 이미지를 생성하고 노드 레이블 및 승인 검사를 통해 일치하지 않는 노드를 거부합니다.
- 11:35배포하는 정확한 텐소르 버전에 맞춰 각 모델 변형 및 해상도에 대한 텐소르 엔진을 미리 빌드하고 캐시하세요.
- 11:41계획 파일은 매트릭스와 연결된 아티팩트로 취급하세요.
- 11:44프로덕션 환경에서 노드 내 엔진 빌드에 절대 의존하지 마세요.
- 11:47이는 버전 변동을 숨기고 콜드 스타트 시간을 늘립니다.
- 11:50이를 확실히 하려면 커널 기능을 검증하는 CI 스모크 테스트를 추가하세요.
- 11:54대상 드라이버와 함께 격리된 런어에서 컨테이너를 실행하고 텐소르가 FP16 커널을 로드하고
- 11:59어텐션 노드가 융합되고 IO 바인딩이 활성화되고 X포머즈 또는 SDP가 승인되었는지 확인하세요.
- 12:05결정 론적 프롬프트 세트를 실행하고 지연 시간이 기준 선창을 초과하거나 로그에 대체 언어가 포함되어 있으면 빌드를 실패시키세요.
- 12:13롤백시 코드와 성능 특성을 모두 복구할 수 있도록 기능 스냅 샷을 이미지 다이제스트와 함께 저장하세요.
- 12:19결국 버전 변동은 버그가 아니라 속도 저하의 원인입니다.
- 12:23시스템은 실행될 것이고 클럭이 이를 증명할 것입니다.
- 12:27증거 파일 시 컨테이너 잘못된 구성으로 인한 효율성 저하는 설계상이 문제입니다.
- 12:33버전이 일치하더라도 컨테이너 내부에서 효율성이 저하될 수 있습니다.
- 12:37증거에 따르면 느린 메모리 누수, 이미지 크기 증가, GPU 연결 부족, 그리고 부하 시 지연 시간을 왜곡하는 할당자 동작이 원인입니다.
- 12:44충돌은 발생하지 않지만 모든 것이 저하됩니다.
- 12:47왜 이것이 중요하냐면 간단합니다.
- 12:49컨테이너는 런타임 환경을 그대로 보여줍니다.
- 12:52이미지가 너무 커서 콜드 스타트가 지연되면 복제본이 제때 도착하지 못합니다.
- 12:56GPU 장치가 마운트 되지 않았거나 런타임에 필요한 플래그가 없으면 실행 공급자가 제대로 작동하지 않습니다.
- 13:01메모리 영역이 램 사용량 급증으로 인해 페이징을 유발하고 극심한 부하 급증을 초래하면 문제가 발생합니다.
- 13:06겉보기에는 문제가 없어 보입니다.
- 13:08컨테이너는 모든 요청에 조용히 부하를 줍니다.
- 13:10하지만 자세히 살펴보면 빌드 시점의 아티팩트가 누적됩니다.
- 13:14멀티 스테이지 빌드가 없기 때문에 컴파일러, 헤더, 테스트 자산으로 인해 이미지 크기가 2GB를 초과합니다.
- 13:19다컬인워 파일이 없으면 노트북, 캐시, 실험적인 가중치가 프로덕션 레이어에 포함됩니다.
- 13:24배포할 때마다 수 기가바이트의 데이터가 네트워크를 통해 전송됩니다.
- 13:27이러한 상황이 노드풀 전체로 확장되면 콜드 스타트는 예외적인 현상이 아니라 정책이 됩니다.
- 13:31증거는 명확합니다.
- 13:33도커 위 기록이 이러한 문제를 여러 겹으로 보여줍니다.
- 13:35런타임 분석은 두 번째 성능 저하 단계를 보여줍니다.
- 13:38명시적인 GPU 플래그가 없거나, 도커의 GPU가 없거나,
- 13:42키번의 내 장치 플러그인 구성이 누락된 경우,
- 13:44프로세스는 엔비디아 장치를 인식하지 못합니다.
- 13:46엔비디아 컨테이너 툴킷의 잘못된 구성으로 인해 리부쿠다가 숨겨지기도 합니다.
- 13:51이로 인해 실행 공급자가 제약 조건 없이 로드되거나 아예 로드되지 않는 문제가 발생합니다.
- 13:55리그, 메모리 통합, 다 적용되지 않아 워크로드가 메모리 슬라이스를 두고
- 13:57경쟁하고 스케줄러가 이를 제대로 인식하지 못해 성능 저하가 발생합니다.
- 14:00로그는 깔끔하게 유지되지만 성능은 서서히 떨어집니다.
- 14:02메모리 동작은 세 번째 성능 저하 단계입니다.
- 14:04기본적으로 ONNX 런타임은 CUDA 메모리 아레나 캐시에 메모리 할당을 적극적으로 저장합니다.
- 14:08동시성이 높은 환경에서는 아레나가 메모리를 과도하게 예약하여 새로운 요청을 처리하지 못할 때까지 안정적인 것처럼 보입니다.
- 14:14고정 메모리가 설정되지 않아 호스트 장치 간 데이터 전송이 페이징 버퍼를 통해 이루어지면서 PCIe가 병목 현상을 일으킵니다.
- 14:20IO가 장치에 바인딩되지 않아 텐서가 CPU와 GPU 사이를 오가며 보이지 않는 지연 시간을 발생시킵니다.
- 14:25극단적인 경우부터 성능이 악화되고 그 다음으로 중간값에 영향을 미칩니다.
- 14:28실제 환경에서 나타나는 증상은 다음과 같습니다.
- 14:31GPU 사용률이 적당한 수준임에도 불구하고 실질적인 처리량은 뒤처집니다.
- 14:34가벼운 부하에서의 지연 시간은 허용 가능한 수준이지만 동시 접속자가 많아지면 P95 지수가 불안정해지다가 예측할 수 없이 급증합니다.
- 14:39간헐적인 메모리 부족 OOM 오류로 인해 트래픽이 최고조에 달했을 때 복제본이 재설정되어 직단 행동이 발생합니다.
- 14:44재시작이 연쇄적으로 발생하고 자동 스케일링이 제대로 작동하지 않으며 Q가 재부축됩니다.
- 14:47운영자는 모델이 무겁다고 생각하여 잘못된 원인을 찾으려 하지만 실제로는 컨테이너 정책이 문제를 야기합니다.
- 14:52컨테이너 위생관리는 증거 처리와 같습니다.
- 14:54다단계 빌드는 흔적을 제거합니다.
- 14:56컴파일러와 개발 도구는 런타임에 절대 사용되지 않습니다.
- 14:59대포판이 없거나 간소화된 기본 이미지는 문제를 최소화하고 풀링 시간을 단축합니다.
- 15:02도커 슬림 또는 다이브 감사를 통해 빌드에서 살아남은 항목을 확인할 수 있습니다.
- 15:06다커리노어 파일은 의도치 않은 대량 생성을 방지합니다.
- 15:08결과적으로 포렌식 분석에서 문제가 없는 깨끗한 상태를 유지할 수 있습니다.
- 15:11실행되어야 하는 항목만 실행됩니다.
- 15:13GPU 사용에는 명확한 구문이 필요합니다.
- 15:15도커에서는 모든 GPU를 선언하거나 정확한 미그 슬라이스를 지정해야 합니다.
- 15:19큐버넷에서는 엔비디아 컴 GPU 리소스를 요청하고
- 15:22장치 플러그인이 드라이버 브랜치와 일치하는지 확인해야 합니다.
- 15:25시작 시 장치 존재 여부와 드라이버 호환성을 검증해야 합니다.
- 15:28엔비디아 SME 및 LD 설정은 장식용이 아니라 승인검사입니다.
- 15:31누락되거나 일치하지 않는 부분이 있으면 위반사항으로 기록하고 종료하십시오.
- 15:35그런 다음 ONNX 런타임과 텐소르를 위도적으로 조정하십시오.
- 15:38프로덕션 환경에서는 실행 공급자 순서를 GPU 경로로만 고정하십시오.
- 15:41CUDA 메모리 영역이 작업 세트를 초과하여 메모리를 과도하게 사용하는 경우
- 15:45비활성화하거나 재조정하는 것을 고려하십시오.
- 15:46증가를 제한하거나 사전 할당을 예측 가능한 범위로 설정하십시오.
- 15:50정확도 가이드라인이 허용하는 경우 FP16을 기본적으로 활성화하십시오.
- 15:54INT8은 정확도 테스트 뒤에 게이트를 설정하십시오.
- 15:57입력이 계산이 수행되는 위치에 도착하도록
- 15:58IO를 장치 메모리에 바인딩하고
- 16:00헤드 오브 라인 블록킹을 방지하기 위해 스트림을 신중하게 선택하십시오.
- 16:03상태와 성능, 두 가지 게이트를 연격하게 관리하십시오.
- 16:06상태는 단순히 200 응답이 아니라 검증된 성능 스냅샷입니다.
- 16:10공급자가 로드되었는지, 융합된 커널이 있는지,
- 16:12텐서 코어가 인식되었는지, IO 바운드 상태 인지 등을 확인합니다.
- 16:15성능은 시작 시 적절한 지연 시간과 사용률 하한선을 갖는 기준 프롬프트 세트입니다.
- 16:20컨테이너가 이 두 가지 조건을 모두 충족하지 못하면 서비스에 허용되지 않습니다.
- 16:24CI 애플 사이즈 예산을 설정하여 임계 값을 초과하는 이미지는 빌드에 실패하도록 합니다.
- 16:28다이제스트별로 이미지 내용의 차이점을 기록하여 롤백시 코드와 무결성을 복원합니다.
- 16:33컨테이너는 단순히 소프트웨어를 배포하는 것이 아니라
- 16:35스트레스 상황에서의 동작 방식을 인코딩한다는 증거가 있습니다.
- 16:38컨테이너가 GPU에 대해 시끄럽거나 무겁거나 모호한 정보를 제공할 경우 가속을 형식적인 절차로 전락시킵니다.
- 16:43반대로 컨테이너가 간결하고 명확하며 적극적일 경우 비용을 지불한 빠른 경로를 유지합니다.
- 16:46이 환경에서는 모든 것이 의도적입니다.
- 16:48컨테이너는 GPU가 제 역할을 하도록 돕거나 방해가 됩니다.
- 16:51마치 포렌식 연구소처럼 명확한 지표들이 모든 것을 증명합니다.
- 16:54지연 시간, 처리량, 활용률, 증거가 의견보다 중요함으로
- 16:58프롬프트 설정을 수정하고 시드를 고정하고 워밍업을 실행합니다.
- 17:01동일한 스케줄러와 단계를 사용하되 512비트의 경우 2025에서 1024비트의 경우 50으로 1024배 확장하여 부하를 파악합니다.
- 17:09동시 실행수는 16으로 유지하고 30이까지 점진적으로 늘립니다.
- 17:13배치 크기는 1부터 시작하여 VRAM 한계에 도달할 때까지 점진적으로 증가시킵니다.
- 17:16추측도 변명도 없이 오직 시간과 카운터만 사용합니다.
- 17:19지연 시간이 가장 먼저 증명됩니다.
- 17:21성능 저하 상태에서 CPU 폴백 또는 일반적인 어텐션 경로,
- 17:25512X512 크기에서 P50는 두 자릿수까지 늘어납니다.
- 17:28P955가 실제 상황을 보여줍니다.
- 17:30Q가 작은 비효율성을 누적시키면서 P95는 예측 불가능하게 20에서 40초까지 변동합니다.
- 17:361024X1024 크기의 50단계로 설정하면 P95는 도착하자마자 허용 범위를 벗어납니다.
- 17:41개선 후 GPU EP가 잠금되고 융합 어텐션이 활성화되고 IO가 장치에 바인딩되면 P50은 한자릿수 초반으로 돌아오고 P95는 허용 범위 내에서 압축됩니다.
- 17:50범위가 줄어들고 시스템이 예측 가능해집니다.
- 17:53처리량도 이를 뒷받침합니다.
- 17:54동시 접속자 16명일 때 성능 저하 경로는 아주 적은 양의 데이터만 처리합니다.
- 17:58각 인스턴스가 자체적으로 멈추기 때문에 복제본을 추가해도 분당 이미지 처리량은 거의 증가하지 않습니다.
- 18:0232명으로 확장하면 처리량이 아니라 경안만 증가합니다.
- 18:05수정 후에는 관계가 정상화됩니다.
- 18:07분당 이미지 처리량은 펜서코어 듀티 사이클이 포화되거나 VRM-E 배치 처리를 제한할 때까지 거의 선형적으로 증가합니다.
- 18:13기울기 차이가 이를 뒷받침합니다.
- 18:15실제로 작업이 더 빨리 완료되는 것이지 단순히 소음만 커지는 것이 아닙니다.
- 18:18활용률 분석이 이를 증명합니다.
- 18:19이전에는 GPU 듀티 사이클이 50%에서 10% 사이를 오르락내리락하며 긴 평탄한 구간을 보였습니다.
- 18:25PCIe 카운터에는 페이징 가능한 전송으로 인한 잡음이 나타났습니다.
- 18:29이후에는 듀티 사이클이 높은 수준으로 안정화되고 펜서코어의 활용도가 눈에 띄게 높아졌습니다.
- 18:35CPU는 오케스트레이션 및 간단한 전처리 작업으로 복귀합니다.
- 18:39PCIe 스파이크는 고정 메모리와 IO 바인딩으로 불필요한 트래픽이 제거되면서 감소합니다.
- 18:44이러한 변화를 설명할 수 있는 유일한 방법은 실제 가속입니다.
- 18:46스트레스 테스트를 추가로 진행했습니다.
- 18:48512x512 스텝 2025에서 고정 경로는 꼬리 스파이크 없이 16개의 동시 처리를 유지합니다.
- 18:5332개로 늘려도 시스템은 안정적으로 성능이 저하됩니다.
- 18:56P95는 예측 가능한 방식으로 증가하며 혼란스럽게 증가하지 않습니다.
- 19:001024x1024 스텝 50에서는 이러한 차이가 더욱 두드러집니다.
- 19:04저하된 경로는 타임아웃으로 인해 문제가 발생합니다.
- 19:07강화된 경로는 VRAM 경계일까지 배치 1에서 2에서 사용 가능한 P50과 허용 가능한 P95를 유지합니다.
- 19:13여기서 아레나와 스트림이 중요해집니다.
- 19:14튜닝 후 헤드 오브 라인 블록킹이 줄어듭니다.
- 19:17비용 측면은 간단한 산술 계산으로 설명할 수 있는데
- 19:20융합된 어텐션 FP16과 IO 바인딩이 검증되면
- 19:23GPU 시간당 요청수가 2에서 5배 증가합니다.
- 19:25이에 따라 이미지 1000개당 실효 비용이 감소합니다.
- 19:28이미지가 작고 엔진이 사전 구축되어 있기 때문에 콜드 스타트 페널티가 줄어듭니다.
- 19:32노드는 첫 번째 터치 시 컴파일 세금을 지불하지 않습니다.
- 19:35원장은 로그와 일치합니다.
- 19:37검증을 통해 우연한 실행을 방지합니다.
- 19:39다른 마이너 드라이버 버전을 사용하는 두 번째 노드 풀에서 반복합니다.
- 19:42강화된 이미지는 설계상 일치하지 않는 노드에서 시작되지 않습니다.
- 19:46따라서 결과는 비교 가능하며 혼동되지 않습니다.
- 19:49기능 스냅샷을 교차 확인합니다.
- 19:51동일한 공급자 순서, 동일한 텐소르, 동일한 커널 어설션을 사용합니다.
- 19:55프롬프트 세트를 다시 실행하고 분포를 다시 캡처합니다.
- 19:58히스토그램이 겹치면 신뢰도가 높아집니다.
- 20:00그렇지 않을 경우 성능 차이가 그 이유를 설명합니다.
- 20:03결국 숫자는 논쟁을 불러 일으키지 않고 유죄를 입증합니다.
- 20:06지연 시간은 줄어들고 처리량은 확장되며 활용률은 안정화됩니다.
- 20:09문제는 가설이 아니라 측정 가능하며 모든 그래프에 흔적을 남깁니다.
- 20:15해결 프로토콜은 반복 가능한 강화 체크리스트입니다.
- 20:18접근 제어가 최우선입니다.
- 20:20텐소르 또는 CUDA 실행 공급자가 없으면 시작을 거부합니다.
- 20:24공급자들 열거하고 장치수를 확인하고 성능 스냅샷, 컨, FP16, INTA 작업 공간을 출력합니다.
- 20:31누락된 항목이 있으면 0이 아닌 종료 코드를 반환합니다.
- 20:33가용성은 무결성을 따릅니다.
- 20:35버전 고정이 핵심입니다.
- 20:37단일 매트릭스 드라이버 브랜치, 컨까지의 CUDA 마이너 버전, ONNX 런타임 빌드 해시, 텐소르를 유지합니다.
- 20:42해당 매트릭스를 기반으로 추론 이미지를 빌드합니다.
- 20:45노드의 레이블을 지정하여 일치시킵니다.
- 20:47동일성 기준에 따라 접근을 허용합니다.
- 20:49모델 및 해상도별로 사전 빌드된 텐소르 엔진을 사용합니다.
- 20:51계획은 런타임 추측이 아닌 결과물입니다.
- 20:54컨테이너 위생은 진실을 보존합니다.
- 20:56멀티 스테이지 빌드를 사용하십시오.
- 20:57런타임을 배포판 없이 또는 간소화된 형태로 유지하십시오.
- 21:00엄격한 다커리노어를 포함하십시오.
- 21:02도커 히스토리와 간소화 감사를 통해 검증하십시오.
- 21:04CI에서 풀 크기 예산을 설정하십시오.
- 21:06크기가 커지는 이미지는 실패 처리하고, 이미지에 서명하고, 다이제스트별로 내용을 비교하십시오.
- 21:10GPU를 먼저 구성하고, EP 순서를 텐소르 CUDA로 고정하고, 프로덕션 환경에서 CPU 공급자들 비활성화하십시오.
- 21:16개발 환경에서 엔비디아 존재 여부와 엔비디아 컨테이너 툴킥 버전을 확인하십시오.
- 21:19MVIDIA.com GPU를 명시적으로 요청하거나, 라이선스를 혼합하여 사용하고, 시작시 검증하십시오.
- 21:24런타임을 최적화하십시오.
- 21:25FP16을 기본적으로 활성화하십시오.
- 21:28INTA는 정확도 검사를 통해 검증하십시오.
- 21:30IO를 장치 메모리에 직접 바인딩하고, 고정 메모리를 활성화하고, 스트림을 선택하여 헤드 오브 라인 블록킹을 방지하십시오.
- 21:37ORT CUDA 아레나가 작업 세트를 벗어나 멈추면 재조정하거나 비활성화하십시오.
- 21:41성능 SLO를 코드로 설정하고, 결정 론적 프롬프트, 지연시간 창 및 사용률 하한선을 사용하여 시작시 자체 테스트를 수행하십시오.
- 21:47백로그가 감소하면 실패 처리하십시오.
- 21:49관찰 가능성, 요청별 GPU 매트릭, 성능 저하 경로 알림, 카나리 프롬프트 및 비교 가능한 기준선을 추가하십시오.
- 21:56성능 게이트와 위반 시 자동 롤백 기능을 갖춘 블루, 그린 테스트를 배포하세요.
- 22:00프로토콜을 강제 적용하면 가속 성능이 추정이 아닌 입증 가능해집니다.
- 22:04이 테스트에서 얻을 수 있는 교훈은 임상적인 관점입니다.
- 22:06CPU 폴백, 버전 변동, 컨테이너 용량 증가는 버그가 아닙니다.
- 22:10이러한 현상은 차단할 수 있는 예측 가능한 오류 패턴입니다.
- 22:13프로토콜을 실행하고, GPU 사용률을 측정하고, 성능이 저하된 경로를 차단하고, 버전을 고정하고, 엔진을 아티팩트로 취급하세요.
- 22:18ONNX 런타임 및 펜소르 메모리 동작, 그리고 아레나를 비활성화해야 하는 시점에 대한 더 자세한 내용은 이 시리즈의 다음 사례를 시청하고 랩노트를 구독하세요.