컨테이너 내 GPU 모니터링 시스템 구축: NVIDIA DCGM, Prometheus, Grafana를 활용한 실시간 분석

2024. 9. 18. 12:14개발/Docker

GPU Monitoring in Containers 프로젝트 소개

프로젝트 배경

최근 대규모 언어 모델(LLM)과 같은 딥러닝 모델이 급격히 발전하면서 GPU의 효율적인 사용이 매우 중요해졌습니다. 특히 여러 컨테이너 환경에서 동시에 다양한 작업이 수행될 때, GPU 사용률을 실시간으로 모니터링하고, 성능 병목을 해결하는 것은 필수적입니다. 기존의 많은 GPU 모니터링 시스템이 컨테이너 단위가 아닌 시스템 전체에 대한 GPU 사용량만을 제공하기 때문에, 컨테이너별로 세밀한 모니터링을 수행하기에는 한계가 있었습니다.

 

이 프로젝트는 NVIDIA DCGM(Data Center GPU Manager), Prometheus, 그리고 Grafana를 사용하여 컨테이너별로 GPU 사용량을 모니터링하고, 이를 시각화하여 GPU 성능 및 자원 사용을 최적화할 수 있는 대시보드를 제공하는 것을 목표로 합니다.

 

차별점 및 주요 구현 내용

이 프로젝트가 기존의 GPU 모니터링 시스템과 차별화되는 핵심 요소는 컨테이너 단위로 GPU 사용량을 추적할 수 있는 커스텀 GPU PID Monitor를 포함한 것입니다. 기존에 공개된 코드들은 대부분 GPU 전체 사용량을 제공하지만, 각 컨테이너별로 GPU 사용량을 추적하는 기능은 부족했습니다.

주요 차별점:

  • GPU PID Monitor: 이 프로젝트는 nvidia-smi와 Docker API를 사용하여 각 컨테이너에서 실행되는 프로세스의 GPU 사용량을 실시간으로 추적합니다. 이를 통해 개별 컨테이너가 사용 중인 GPU 리소스를 세밀하게 모니터링할 수 있습니다.
  • 사라진 프로세스 처리: GPU를 사용하는 프로세스가 종료되면 해당 프로세스의 GPU 사용량을 0으로 설정하고, 일정 시간이 지나면 메트릭을 제거하는 기능을 구현하여 불필요한 메트릭을 관리합니다.
  • 컨테이너 이름과 GPU ID에 따른 메트릭 수집: 각 컨테이너 이름과 GPU ID를 기준으로 GPU 메모리 사용량을 기록하고, 이를 Prometheus로 전송하여 Grafana에서 시각화할 수 있습니다.
  • GPU 메트릭 초기화 및 관리: 서버 재시작 시 기존 메트릭을 초기화하여 불필요한 GPU 데이터가 남지 않도록 하고, 시스템 상태를 깔끔하게 유지할 수 있습니다.

Dockerfile 예시:

FROM nvidia/cuda:12.2.0-devel-ubuntu22.04  

RUN apt-get update && apt-get install -y python3 python3-pip
RUN mkdir -p /data

COPY requirements.txt .
RUN pip3 install -r requirements.txt

COPY gpu_monitor.py .

CMD ["python3", "gpu_monitor.py"]

 

프로젝트 목표

이 프로젝트의 주요 목적은 다음과 같습니다:

  • NVIDIA GPU가 장착된 서버에서 컨테이너 단위로 GPU 사용량을 모니터링하는 것
  • GPU 메트릭을 실시간으로 수집하고, 시각화하여 성능 병목을 해결
  • PrometheusGrafana를 사용하여 직관적인 대시보드를 제공
  • GPU 리소스 효율성을 극대화하고, 컨테이너 간 자원 사용을 효율적으로 분배

프로젝트 구성 요소

이 프로젝트는 몇 가지 주요 컴포넌트로 구성되어 있습니다. 각 컴포넌트는 특정 기능을 담당하며, 이를 통해 전체적인 GPU 모니터링 환경을 구축할 수 있습니다.

1. DCGM Exporter

NVIDIA DCGM Exporter는 NVIDIA GPU의 메트릭을 수집하여 Prometheus로 전송하는 역할을 합니다. 이 메트릭에는 GPU 사용률, 메모리 사용량, 전력 소비, 온도 등이 포함됩니다. 이를 통해 GPU 성능을 실시간으로 추적할 수 있습니다.

2. Prometheus

Prometheus는 모니터링과 경고 시스템으로, DCGM Exporter에서 수집된 GPU 메트릭을 저장하고 쿼리할 수 있도록 지원합니다. 이 데이터를 나중에 Grafana에서 시각화할 수 있습니다.

3. Grafana

Grafana는 Prometheus로부터 GPU 메트릭을 가져와 시각화하는 대시보드 도구입니다. 이를 통해 GPU 사용률, 메모리 사용량, 온도 등의 정보를 실시간으로 그래프로 확인할 수 있습니다.

4. cAdvisor

cAdvisor는 컨테이너의 리소스 사용량(CPU, 메모리, 네트워크 등)을 모니터링하는 도구입니다. 이를 통해 각 컨테이너의 GPU 사용량뿐만 아니라, 전체적인 리소스 사용량을 함께 모니터링할 수 있습니다.

5. GPU PID Monitor

GPU PID Monitor는 각 컨테이너에서 실행 중인 프로세스가 얼마나 많은 GPU 자원을 사용하는지 추적하는 커스텀 모니터링 도구입니다. 이를 통해 컨테이너 간 GPU 사용량을 효율적으로 추적할 수 있습니다.


개발 과정

이 프로젝트는 NVIDIA GPU가 장착된 서버 환경에서 컨테이너화된 워크로드의 GPU 자원을 실시간으로 모니터링하고 최적화하는 것을 목표로 시작되었습니다. 프로젝트는 단계적으로 개발되었으며, 각각의 개발 단계는 아래와 같습니다.

1단계: DCGM Exporter 설정

첫 번째 단계는 DCGM Exporter를 설정하여 GPU 메트릭을 수집하는 것이었습니다. 이를 위해 NVIDIA의 공식 DCGM Exporter 도커 이미지를 사용했습니다. 이 이미지를 통해 GPU 사용률, 메모리, 온도, 전력 소비 등의 메트릭을 수집하고 이를 Prometheus로 전송할 수 있었습니다.

dcgm-exporter:
  image: nvidia/dcgm-exporter:latest
  environment:
    - NVIDIA_VISIBLE_DEVICES=all
  devices:
    - /dev/nvidiactl:/dev/nvidiactl
    - /dev/nvidia-uvm:/dev/nvidia-uvm
    - /dev/nvidia0:/dev/nvidia0
  expose:
    - "9400"

2단계: Prometheus와 Grafana 통합

다음으로 Prometheus를 설정하여 DCGM Exporter에서 수집된 메트릭을 저장하고, Grafana를 통해 이를 시각화했습니다. Prometheus는 GPU 메트릭을 쿼리하고, Grafana는 이를 사용자 친화적인 대시보드로 변환해줍니다.

prometheus:
  image: prom/prometheus:latest
  volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml
  ports:
    - "9090:9090"
  depends_on:
    - dcgm-exporter

grafana:
  image: grafana/grafana:latest
  ports:
    - "3000:3000"
  depends_on:
    - prometheus

3단계: GPU PID Monitor 구현

마지막 단계에서는 각 컨테이너의 GPU 사용량을 PID 기반으로 모니터링하는 도구인 GPU PID Monitor를 구현했습니다. 이 도구를 통해 GPU 사용률을 더 세밀하게 추적할 수 있게 되었으며, 컨테이너별로 GPU 자원을 효율적으로 분배할 수 있었습니다.


설치 및 실행 방법

1. 의존성 설치

프로젝트를 실행하기 전에, DockerDocker Compose가 설치되어 있어야 합니다. 또한, NVIDIA 드라이버와 nvidia-docker도 사전에 설치해야 합니다.

2. Docker Compose 실행

프로젝트 루트에서 아래 명령을 실행하여 모든 서비스를 시작할 수 있습니다.

docker-compose up -d

3. Grafana 대시보드 확인

Grafana는 http://localhost:3000에서 실행됩니다. 기본 로그인 정보는 아래와 같습니다:

  • ID: admin
  • Password: admin

로그인 후, Prometheus를 데이터 소스로 추가하고, GPU 관련 대시보드를 설정하면 실시간으로 GPU 성능을 모니터링할 수 있습니다.


프로젝트 결론

이 프로젝트는 NVIDIA GPU가 장착된 서버 환경에서 여러 컨테이너의 GPU 사용량을 실시간으로 모니터링하고, 컨테이너별로 GPU 자원 사용을 시각화할 수 있는 기능을 제공합니다.

이를 통해 GPU 리소스를 더 효율적으로 관리할 수 있을 것 같습니다.

향후 계획

향후에는 더 많은 GPU 메트릭을 수집하고, 사용자 정의 대시보드 기능을 추가하여, 다양한 환경에서 더욱 폭넓게 활용할 수 있도록 확장할 계획입니다.

 

 

결과물

grafana를 활용하여 nvidia 에서 cuda 에 대한 메모리 확인과 각 container 별로의 gpu 사용량을 측정하게 하였습니다.

 

728x90