GPU를 분할 사용하여 하드웨어 효율을 높이는 솔루션
2024년 12월, 엔비디아(NVIDIA는 GPU 오케스트레이션 소프트웨어 개발사 run:ai(런AI) 인수를 마쳤습니다. run:ai는 GPU를 분할 사용하여 자원의 가동률(Utilization)을 높이는 솔루션을 제공하며, 엔비디아 장비에서 원활히 구동되도록 구성되어 있습니다.
GPU에서 AI 모델을 구동하는 경우, 일반적으로 하나의 GPU에는 하나의 모델을 구동시키는 '정적 할당(Static Allocation)' 방식을 사용합니다. 간단한 구조라는 장점이 있지만, 모델 구동이 유휴(Idle) 상태일 때 GPU의 연산이 대기 상태로 머물게 되어 가동률이 낮아지고, 모델이 GPU 메모리의 일부만 사용하는 경우에는 메모리 자원을 모두 활용하지 못하는 비효율이 발생할 가능성이 높은 한계가 있습니다. GPU는 신제품이 출시될 때마다 연산 속도가 빨라지고 메모리 크기 또한 커집니다. 하나의 GPU에 하나의 모델만 구동하는 정적 할당 방식은 GPU 성능이 높아질수록 더욱 빠르게 결과를 도출해 내고, 적절한 조율이 없다면 GPU가 더 자주 유휴 상태에 머무르는 배경이 됩니다. 가동률이 낮아질 수 있다는 의미입니다.
run:ai는 GPU 코어와 메모리의 가동률을 높이기 위해 '동적 할당(Dynamic Allocation)' 방식으로 모델을 구동합니다. 하나의 GPU에 여러 개의 모델을 구동시키는 방식입니다.
추론 과정에서 정적 할당(Static Allocation)을 사용하는 경우, 모델의 배치 크기에 따라 GPU 메모리 사용량에 변화가 발생합니다. 아래 그림은 두 개의 GPU에 두 개의 모델(모델A, 모델B)을 각각 정적 할당한 상황을 나타냅니다. 평균 메모리 사용량과 최대 메모리 사용량을 구분하여 표시해 두었습니다.
이번에는 run:ai를 활용하여 하나의 GPU에 두 개의 모델을 동적 메모리 할당(Dynamic Memory Allocation) 방식으로 구동하는 경우를 살펴봅시다. 아래 그림과 같이 GPU 하나에 모델A와 모델B를 모두 구동시킵니다. 이때 GPU의 메모리는 모델A와 모델B의 파라미터의 합과 최소 메모리 사용량보다 커야 합니다. GPU 메모리에는 모델A와 모델B 파라미터가 항상 로드되어 있는 상태이며, 남아 있는 메모리는 모델의 배치 데이터 및 모델 구동에 필요한 데이터를 로드하기 위한 공간입니다. 즉 GPU 하나에 두 개의 모델을 모두 구동할 수 있도록 준비해 두고, 추론 요청에 따라 모델A 또는 모델B를 선택하여 구동하는 방식입니다.
동적 메모리 할당 시에는 GPU 자원이 추론에 필요한 메모리량보다 부족하여 메모리 부족(OOM; Out-of-Memory) 현상이 발생할 수 있습니다. 하나의 GPU에 여러 모델을 구동하는 경우에는 각 모델의 최대 메모리 사용량 합계가 GPU의 전체 메모리 용량을 초과하는 경우가 일반적입니다. 따라서 동적 할당 방식에서는 OOM 이벤트 발생이 일반적인 현상이라 볼 수 있습니다.
run:ai는 다음과 같은 구조로 메모리 충돌(Memory Collision) 문제를 해결합니다.
1. OOM 이벤트 발생 시, 충분한 메모리가 확보될 때까지 대기합니다. GPU 추론 연산은 빠르게 처리되므로 대부분 수 초 내에 메모리 문제가 해결됩니다.
2. 여러 작업에서 OOM 이벤트가 동시에 발생할 경우, 사전에 설정된 작업 우선순위에 따라 확보된 메모리를 할당합니다.
3. OOM 상태가 지속될 경우, OOM이 발생한 작업을 실행하기 위해 다른 모델이 사용 중인 GPU 메모리를 CPU 메모리로 이동시킨 후 처리합니다.
위와 같은 세 가지의 구성을 통해 OOM 문제를 해결하도록 구성해 두었습니다.
특히 3번째의 GPU 메모리의 내용을 CPU로 옮긴 뒤 OOM을 처리하는 부분이 인상적입니다.
run:ai는 GPU와 CPU 사용률에 따라 자원을 늘리고 줄이는 오토 스케일링(Auto-Scaling) 기능을 제공합니다. 업 스케일링(Up Scaling)과 다운 스케일링(Down Scaling) 모두 지원합니다. GPU의 사용률이 임계점을 넘어서면 할당하는 GPU를 늘리고, 일정 수준 이하의 사용률을 보이면 할당된 GPU를 해제하는 방식으로 공작합니다. GPU 사용률 외에도 CPU 사용률, 작업 응답 지연 시간, 동시 접속 수 등의 기준점을 활용하여 오토 스케일링을 설정할 수 있습니다.
run:ai는 쿠버네티스(Kubernetes) 또는 오픈시프트(OpenShift) 기반의 자원 관리를 수행하며, 엔비디아의 트라이톤(Triton) 환경에서 동작합니다. 따라서 학습(Training)과 추론(Inference) 워크로드 모두 run:ai로 구동할 수 있습니다.
run:ai는 SaaS 사용도 가능하지만, 오픈소스 프로젝트이므로 On-Premise 환경에서 직접 구축하여 사용하는 것도 가능합니다. 엔비디아 트라이톤(Triton) 환경을 사용할 수 있는 쿠버네티스(Kubernetes)에서 run:ai를 적용할 수 있습니다.
엔비디아는 run:ai 인수 이후 모든 프로젝트를 오픈소스로 전환하였습니다. 인수 과정에서는 반독점 관련 문제가 제기되었으며, 이로 인해 2024년 4월에 시작한 run:ai 인수 작업은 8개월이 경과한 2024년 12월에 마치게 되었습니다. 반독점 문제의 해소 조건으로 프로젝트의 오픈소스 공개 요구를 받았을 가능성이 있으며, 엔비디아의 다른 프로젝트 또한 오픈소스로 공개되는 상황을 고려할 때 run:ai 또한 앞으로도 오픈소스 정책을 유지할 것으로 보입니다.
run:ai GitHub Repository: https://github.com/run-ai
Assign the Right Amount of Compute Power to Users, Automatically | NVIDIA