개발일지와 메모사이

AMD GPU 완전 모니터링 환경 구축 가이드

딸기카레 2025. 7. 7. 13:49

AMD 그래픽 드라이버가 설치된 상태에서 GPU의 온도, 전압, 메모리, 클럭 등을 완전하게 모니터링할 수 있는 환경을 구축하는 방법이다.

전제 조건

  • AMD GPU 드라이버(AMDGPU)가 설치되어 있어야 함
  • Ubuntu 22.04 LTS 또는 24.04 LTS 권장
  • 사용자가 video, render 그룹에 속해야 함

1. 필수 패키지 설치

# 패키지 목록 업데이트
sudo apt update

# 필수 모니터링 도구 설치
sudo apt install -y radeontop lm-sensors mesa-utils

# 추가 유틸리티 설치 (선택사항)
sudo apt install -y htop nvtop

2. 사용자 권한 설정

# 현재 사용자를 video, render 그룹에 추가
sudo usermod -a -G video,render $USER

# 그룹 변경 적용을 위해 로그아웃/로그인 또는 다음 명령어 실행
newgrp video
newgrp render

# 권한 확인
groups

3. GPU 장치 확인

# GPU 인식 확인
lspci | grep VGA

# AMDGPU 드라이버 로드 확인
lsmod | grep amdgpu

# DRM 장치 확인
ls -la /dev/dri/

# GPU 카드 번호 확인 (보통 card0 또는 card1)
ls -la /sys/class/drm/ | grep card

4. 센서 초기화 및 설정

# 센서 감지 및 설정
sudo sensors-detect --auto

# 센서 모듈 로드
sudo modprobe k10temp  # AMD CPU 센서 (선택사항)

# 센서 작동 확인
sensors

5. GPU 모니터링 권한 설정

# GPU 장치 파일 권한 확인 (card 번호는 실제 환경에 맞게 조정)
ls -la /dev/dri/card*

# 필요시 권한 설정 (일반적으로는 불필요)
# sudo chmod 644 /sys/class/drm/card*/device/gpu_busy_percent
# sudo chmod 644 /sys/class/drm/card*/device/mem_info_*

6. GPU 카드 번호 자동 감지

# GPU 카드 번호를 자동으로 찾는 함수
find_gpu_card() {
    for card in /sys/class/drm/card*; do
        if [ -f "$card/device/gpu_busy_percent" ]; then
            echo "$(basename $card)"
            return
        fi
    done
    echo "card0"  # 기본값
}

# 사용법
GPU_CARD=$(find_gpu_card)
echo "GPU Card: $GPU_CARD"

7. 모니터링 스크립트 생성

A. 기본 모니터링 스크립트

# ~/gpu_monitor.sh 파일 생성
cat > ~/gpu_monitor.sh << 'EOF'
#!/bin/bash

# GPU 카드 자동 감지
find_gpu_card() {
    for card in /sys/class/drm/card*; do
        if [ -f "$card/device/gpu_busy_percent" ]; then
            echo "$(basename $card)"
            return
        fi
    done
    echo "card0"
}

GPU_CARD=$(find_gpu_card)
GPU_PATH="/sys/class/drm/$GPU_CARD/device"

echo "=== AMD GPU 모니터링 ==="
echo "GPU Card: $GPU_CARD"
echo

while true; do
    clear
    echo "=== AMD GPU Status $(date) ==="
    echo
    
    # GPU 사용률
    if [ -f "$GPU_PATH/gpu_busy_percent" ]; then
        echo "GPU Usage: $(cat $GPU_PATH/gpu_busy_percent)%"
    fi
    
    # VRAM 정보
    if [ -f "$GPU_PATH/mem_info_vram_used" ] && [ -f "$GPU_PATH/mem_info_vram_total" ]; then
        vram_used=$(($(cat $GPU_PATH/mem_info_vram_used) / 1024 / 1024))
        vram_total=$(($(cat $GPU_PATH/mem_info_vram_total) / 1024 / 1024))
        echo "VRAM: ${vram_used}MB / ${vram_total}MB"
    fi
    
    # 온도, 전압, 전력 정보
    echo
    sensors | grep -A 20 amdgpu
    
    # GPU 클럭
    echo
    echo "GPU Clock:"
    cat $GPU_PATH/pp_dpm_sclk 2>/dev/null | grep "*" || echo "N/A"
    echo "Memory Clock:"
    cat $GPU_PATH/pp_dpm_mclk 2>/dev/null | grep "*" || echo "N/A"
    
    sleep 1
done
EOF

# 실행 권한 부여
chmod +x ~/gpu_monitor.sh

B. 멀티 터미널 모니터링 스크립트

# ~/multi_gpu_monitor.sh 파일 생성
cat > ~/multi_gpu_monitor.sh << 'EOF'
#!/bin/bash

# GPU 카드 자동 감지
find_gpu_card() {
    for card in /sys/class/drm/card*; do
        if [ -f "$card/device/gpu_busy_percent" ]; then
            echo "$card"
            return
        fi
    done
    echo "/sys/class/drm/card0"
}

GPU_PATH=$(find_gpu_card)
GPU_CARD=$(basename $GPU_PATH)

echo "AMD GPU 멀티 터미널 모니터링 시작"
echo "GPU Card: $GPU_CARD"
echo
echo "다음 명령어들을 각각 다른 터미널에서 실행하면 된다:"
echo
echo "# 터미널 1: 실시간 GPU 사용률"
echo "radeontop"
echo
echo "# 터미널 2: 온도, 전압, 전력, VRAM 모니터링"
echo "watch -n 1 'sensors | grep -A 20 amdgpu'"
echo
echo "# 터미널 3: GPU 클럭 모니터링"
echo "watch -n 1 'echo \"GPU Clock:\" && cat $GPU_PATH/device/pp_dpm_sclk | grep \"*\" && echo \"Memory Clock:\" && cat $GPU_PATH/device/pp_dpm_mclk | grep \"*\"'"
echo
echo "# 터미널 4: 통합 센서 및 VRAM 정보"
echo "watch -n 1 'sensors && echo \"VRAM: \$(($(cat $GPU_PATH/device/mem_info_vram_used) / 1024 / 1024))MB / \$(($(cat $GPU_PATH/device/mem_info_vram_total) / 1024 / 1024))MB\"'"
echo
EOF

# 실행 권한 부여
chmod +x ~/multi_gpu_monitor.sh

8. 모니터링 환경 테스트

# 1. 기본 기능 테스트
echo "=== 기본 기능 테스트 ==="

# GPU 인식 테스트
echo "GPU 인식:"
lspci | grep VGA

# radeontop 테스트
echo "radeontop 실행 테스트 (5초간):"
timeout 5 radeontop || echo "radeontop 실행 실패"

# sensors 테스트
echo "Sensors 테스트:"
sensors | grep -A 5 amdgpu || echo "AMD GPU 센서 정보 없음"

# GPU 정보 접근 테스트
echo "GPU 정보 파일 접근 테스트:"
for file in gpu_busy_percent mem_info_vram_total mem_info_vram_used pp_dpm_sclk pp_dpm_mclk; do
    if find /sys/class/drm/card*/device/ -name "$file" -exec cat {} \; 2>/dev/null | head -1 >/dev/null; then
        echo "✅ $file 접근 가능"
    else
        echo "❌ $file 접근 불가"
    fi
done

9. 사용법

통합 모니터링 실행

# 하나의 터미널에서 모든 정보 보기
~/gpu_monitor.sh

멀티 터미널 모니터링 실행

# 명령어 출력
~/multi_gpu_monitor.sh

# 출력된 명령어들을 각각 다른 터미널에서 실행하면 됨

개별 모니터링 명령어

# 터미널 1: 실시간 GPU 사용률
radeontop

# 터미널 2: 온도, 전압, 전력, VRAM 모니터링
watch -n 1 'sensors | grep -A 20 amdgpu'

# 터미널 3: GPU 클럭 모니터링
watch -n 1 'echo "GPU Clock:" && cat /sys/class/drm/card*/device/pp_dpm_sclk | grep "*" && echo "Memory Clock:" && cat /sys/class/drm/card*/device/pp_dpm_mclk | grep "*"'

# 터미널 4: 통합 센서 및 VRAM 정보
watch -n 1 'sensors && echo "VRAM: $(($(cat /sys/class/drm/card*/device/mem_info_vram_used) / 1024 / 1024))MB / $(($(cat /sys/class/drm/card*/device/mem_info_vram_total) / 1024 / 1024))MB"'

10. 문제 해결

GPU 카드가 card0이 아닌 경우

# 실제 GPU 카드 번호 확인
ls -la /sys/class/drm/ | grep card

# 명령어에서 card* 부분을 실제 카드 번호로 변경
# 예: card1인 경우
watch -n 1 'echo "GPU Clock:" && cat /sys/class/drm/card1/device/pp_dpm_sclk | grep "*"'

권한 문제가 발생하는 경우

# 사용자 그룹 재확인
groups

# 로그아웃 후 다시 로그인 또는
newgrp video
newgrp render

센서 정보가 나오지 않는 경우

# 센서 다시 감지
sudo sensors-detect --auto

# 센서 모듈 재로드
sudo modprobe k10temp
sudo systemctl restart lm-sensors

11. 모니터링 정보 해석

온도 정보

  • edge: GPU 다이 가장자리 온도 (일반적인 GPU 온도)
  • junction: GPU 핫스팟 온도 (가장 뜨거운 부분)
  • mem: GPU 메모리 온도

임계 온도

  • edge crit: 보통 100°C (안전 임계점)
  • junction crit: 보통 110°C (핫스팟 임계점)
  • mem crit: 보통 105°C (메모리 임계점)

전력 정보

  • PPT: 현재 전력 소비
  • cap: 최대 전력 한계 (TDP)

이제 AMD GPU의 모든 주요 정보를 실시간으로 모니터링할 수 있다.