서버 환경이나 고성능 워크스테이션을 운영할 때 시스템에 장착된 물리적 그래픽 카드(GPU)를 정확히 파악하는 것은 매우 중요합니다. 특히 딥러닝, 고성능 컴퓨팅(HPC), 가상화 환경 등에서는 GPU 리소스의 정확한 파악과 효율적인 관리가 성능에 직접적인 영향을 미칩니다. 이 포스팅에서는 리눅스 환경에서 물리적 그래픽 카드를 검출하는 다양한 방법과 관련 지식을 자세히 살펴보겠습니다.
목차
- 물리적 그래픽 카드 개수 확인 방법
- 가상 환경에서의 GPU 탐지
- GPU 상태 모니터링 및 관리
- 멀티 GPU 시스템 구성 시 고려사항
- GPU 가상화 기술
- 문제 해결 가이드
- 고급 사용 사례
1. 물리적 그래픽 카드 개수 확인 방법
리눅스 시스템에서 물리적 그래픽 카드의 개수와 정보를 확인하는 방법은 여러 가지가 있습니다. 각 방법은 서로 다른 수준의 상세 정보를 제공합니다.
1.1 PCI 장치 정보 확인 (모든 GPU 유형)
lspci
명령어는 시스템의 PCI 버스에 연결된 모든 장치를 표시하며, 그래픽 카드도 여기에 포함됩니다:
# 기본 그래픽 카드 정보 확인
lspci | grep -i vga
# 더 자세한 그래픽 컨트롤러 정보 (3D, VGA, 디스플레이 컨트롤러 포함)
lspci | grep -E "VGA|3D|Display"
# 특정 그래픽 카드에 대한 상세 정보
lspci -v -s $(lspci | grep -i vga | cut -d' ' -f1)
주요 정보 해석:
- Bus ID:
00:01.0
와 같은 형식으로 표시되며, GPU의 물리적 위치를 나타냅니다. - 제조사 및 모델: NVIDIA, AMD, Intel 등 제조사와 구체적인 모델명을 확인할 수 있습니다.
- 메모리 및 기능:
-v
옵션으로 확인 가능한 메모리 크기, 지원 기능 등의 상세 정보입니다.
1.2 하드웨어 장치 정보 확인
lshw
명령어는 시스템의 하드웨어 구성에 대한 자세한 정보를 제공합니다:
# 그래픽 카드(display) 정보만 확인
sudo lshw -C display
# 좀 더 포맷팅된 형태로 출력
sudo lshw -C display -json
sudo lshw -C display -xml
lshw
출력에서 확인할 수 있는 주요 정보:
- 물리적 ID: 카드의 물리적 위치
- 제품명 및 벤더: 구체적인 모델명과 제조사
- 버스 정보: PCI 버스 ID
- 구성 정보: 드라이버, 해상도 등
- 리소스 사용: IRQ, 메모리 주소 등
1.3 NVIDIA 전용 도구 (NVIDIA GPU)
NVIDIA GPU를 사용하는 경우, nvidia-smi
도구가 가장 상세하고 유용한 정보를 제공합니다:
# 기본 정보 표시
nvidia-smi
# 간략한 정보만 표시
nvidia-smi --query-gpu=count,name,pci.bus_id --format=csv
# 지속적 모니터링 (1초 간격으로 갱신)
nvidia-smi -l 1
nvidia-smi
출력 해석:
- GPU 개수 및 ID: 시스템에 설치된 NVIDIA GPU의 수와 각 ID
- 모델명: GeForce, Quadro, Tesla, RTX 등 제품군과 모델명
- 드라이버 및 CUDA 버전: 설치된 드라이버 버전과 지원되는 CUDA 버전
- 성능 상태: 전력 사용량, 온도, 팬 속도, 사용률 등
- 메모리 사용량: 총 메모리, 사용 중인 메모리, 여유 메모리
- 실행 중인 프로세스: 각 GPU를 사용 중인 프로세스 정보
1.4 AMD 전용 도구 (AMD GPU)
AMD GPU의 경우 rocm-smi
도구를 사용할 수 있습니다(ROCm 스택이 설치된 경우):
# 기본 정보 표시
rocm-smi
# 지속적 모니터링
rocm-smi --monitor
1.5 커널 정보 확인
리눅스 커널이 인식한 GPU 정보를 확인하는 방법:
# 드라이버 모듈 확인
lsmod | grep -E 'nvidia|nouveau|amdgpu|radeon|i915'
# 디바이스 노드 확인
ls -la /dev/dri/
# 드라이버 정보 확인
sudo dmesg | grep -E 'gpu|graphics|VGA|amdgpu|nvidia|nouveau|intel'
1.6 X 서버 정보 확인 (그래픽 환경)
X 서버를 사용하는 그래픽 환경에서는 다음 명령으로 정보를 확인할 수 있습니다:
# X 서버에서 인식하는 디스플레이 장치
xrandr --listproviders
# 더 자세한 정보
sudo X -configure :1
2. 가상 환경에서의 GPU 탐지
가상 환경에서는 물리적 GPU와 가상 GPU를 구분하는 것이 중요합니다. 특히 Red Hat Virtualization, VMware, Xen 등의 환경에서는 이런 구분이 더욱 필요합니다.
2.1 가상 GPU vs 물리적 GPU
가상 환경에서는 흔히 다음과 같은 그래픽 장치가 나타날 수 있습니다:
- 에뮬레이션된 그래픽 어댑터:
- QXL(QEMU/KVM), VMSVGA(VMware), Cirrus Logic 등
- 순수하게 소프트웨어적으로 에뮬레이션되며, 성능이 제한적입니다
- 기본적인 디스플레이 기능에 적합합니다
- 패스스루(Passthrough) GPU:
- 물리적 GPU를 VM에 직접 할당한 경우
- 거의 네이티브에 가까운 성능을 제공합니다
lspci
출력에서 실제 GPU 모델명이 그대로 표시됩니다
- vGPU(가상 GPU):
- 하나의 물리적 GPU를 여러 VM이 공유하는 기술
- NVIDIA GRID, AMD MxGPU 등의 기술을 사용합니다
- 특수한 드라이버가 필요합니다
2.2 가상 환경에서 물리적 GPU 확인 방법
# 가상화 여부 확인
systemd-detect-virt
hostnamectl
# QEMU/KVM 환경에서 QXL 확인
lspci | grep -i qxl
# GPU 패스스루 확인
lspci -nnk | grep -A3 "VGA\|3D\|Display"
# IOMMU 그룹 확인 (GPU 패스스루 관련)
find /sys/kernel/iommu_groups/ -type l | sort -V
2.3 VFIO 상태 확인 (GPU 패스스루)
GPU 패스스루를 사용하는 경우 VFIO 드라이버 상태를 확인할 수 있습니다:
# VFIO 모듈 로드 여부
lsmod | grep vfio
# VFIO에 할당된 장치 확인
ls -l /dev/vfio/
3. GPU 상태 모니터링 및 관리
물리적 GPU의 개수를 파악한 후에는 이들의 상태를 모니터링하고 관리하는 것이 중요합니다.
3.1 NVIDIA GPU 모니터링
# 주요 정보만 정기적으로 모니터링
watch -n 1 nvidia-smi
# 특정 정보만 추출하여 모니터링
nvidia-smi --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.total --format=csv -l 1
# 프로세스별 GPU 사용량
nvidia-smi pmon -i 0
3.2 NVIDIA GPU 관리
# GPU 전력 제한 설정
sudo nvidia-smi -pl 180 # 180W로 제한
# 특정 애플리케이션의 GPU 사용 제한
sudo nvidia-smi -c 3 # Compute 모드로 설정 (그래픽 모드 비활성화)
# GPU 리셋
sudo nvidia-smi --gpu-reset -i 0 # GPU 0 리셋
3.3 AMD GPU 모니터링 및 관리
# 상태 모니터링
sudo rocm-smi --showuse
sudo rocm-smi --showtemp
# 전력 관리
sudo rocm-smi --setperflevel high
3.4 사용자 정의 모니터링 스크립트
복잡한 멀티 GPU 환경에서는 사용자 정의 모니터링 스크립트가 유용할 수 있습니다:
#!/bin/bash
# GPU 상태 모니터링 스크립트 예시
while true; do
echo "======== $(date) ========"
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw --format=csv,noheader
sleep 5
done
4. 멀티 GPU 시스템 구성 시 고려사항
여러 개의 물리적 GPU를 사용하는 시스템을 구성할 때 고려해야 할 사항들을 살펴보겠습니다.
4.1 하드웨어 고려사항
- PCIe 레인 및 대역폭:
- 각 GPU는 일정한 PCIe 레인을 필요로 합니다 (보통 x16)
- CPU와 마더보드가 충분한 PCIe 레인을 제공하는지 확인해야 합니다
- 예: 4개의 GPU를 x16로 사용하려면 최소 64 PCIe 레인이 필요합니다
- 전력 공급:
- 고성능 GPU는 많은 전력을 소비합니다 (200~350W)
- 충분한 용량의 전원 공급 장치가 필요합니다
- 각 GPU에 대한 추가 전원 커넥터 확인 (6핀, 8핀 등)
- 냉각 시스템:
- 다중 GPU는 많은 열을 발생시킵니다
- 적절한 케이스 공기 흐름과 냉각 솔루션이 필요합니다
- GPU 간 간격:
- GPU 간 적절한 간격을 유지하여 열 문제 방지
- 라이저 케이블 사용 고려
4.2 소프트웨어 고려사항
- GPU ID 매핑:
- 리눅스에서 GPU ID는 PCI 슬롯 위치에 따라 결정됩니다
- 재부팅 후에도 일관된 ID 유지를 위한 설정 필요
- CUDA/ROCm 설정:
- CUDA_VISIBLE_DEVICES 환경 변수로 특정 애플리케이션에 사용할 GPU 지정 가능
- MPS(Multi-Process Service)를 통한 CUDA 리소스 공유 설정
- 커널 매개변수:
- 멀티 GPU 성능을 위한 특수 커널 매개변수 설정
- NUMA 노드와 GPU 간 최적 매핑
4.3 멀티 GPU 최적화 예시
# 특정 GPU만 사용하도록 설정
export CUDA_VISIBLE_DEVICES=0,2 # GPU 0과 2만 사용
# NUMA 노드와 GPU 간 최적 매핑을 위한 실행
numactl --cpunodebind=0 --membind=0 ./my_gpu_application
# GPU 간 직접 통신(P2P) 상태 확인
nvidia-smi topo -m
5. GPU 가상화 기술
물리적 GPU 리소스를 효율적으로 활용하기 위한 가상화 기술에 대해 알아보겠습니다.
5.1 GPU 패스스루 (PCI Passthrough)
가장 기본적인 GPU 가상화 방식으로, 물리적 GPU를 VM에 직접 할당합니다:
<!-- libvirt XML 구성 예시 -->
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</source>
</hostdev>
설정 단계:
- IOMMU 활성화 (BIOS 및 커널 매개변수)
- VFIO 드라이버 설정
- GPU를 호스트 드라이버에서 분리
- VM 구성에 GPU 추가
5.2 NVIDIA vGPU
NVIDIA의 GPU 가상화 기술로, 하나의 물리적 GPU를 여러 VM이 공유할 수 있습니다:
- 지원 하드웨어: NVIDIA RTX A6000, A100, V100 등 특정 데이터센터급 GPU
- 라이센스 필요: NVIDIA vGPU 소프트웨어 라이센스 필요
- 프로필 구성: vGPU 프로필에 따라 GPU 메모리 및 성능 할당
# vGPU 상태 확인
nvidia-smi vgpu
nvidia-smi vgpu -c
5.3 AMD MxGPU
AMD의 하드웨어 기반 GPU 가상화 기술:
- 지원 하드웨어: AMD Instinct 시리즈 등 특정 데이터센터급 GPU
- SR-IOV 기반: Single Root I/O Virtualization 기술 기반
5.4 GPU 공유 기술
완전한 가상화는 아니지만, 여러 사용자나 프로세스가 GPU를 공유하는 기술:
- NVIDIA MPS(Multi-Process Service):
- CUDA 애플리케이션 간 GPU 컨텍스트 공유
- 커널 실행 및 메모리 최적화
- 시간 공유 스케줄링:
- Kubernetes 등에서 사용하는 GPU 시간 공유 기법
- 프로세스별로 GPU 접근 시간 할당
6. 문제 해결 가이드
GPU 검출 및 사용 시 발생할 수 있는 문제에 대한 해결 방법입니다.
6.1 GPU가 검출되지 않는 경우
- 드라이버 문제 확인:
# 드라이버 상태 확인
lsmod | grep -E 'nvidia|nouveau|amdgpu'
# 드라이버 로그 확인
dmesg | grep -E 'nvidia|nouveau|amdgpu'
# 드라이버 재설치
sudo apt purge nvidia* # Ubuntu 예시
sudo apt install nvidia-driver-XXX
- BIOS 설정 확인:
- PCIe 슬롯 활성화 여부
- 기본 그래픽 어댑터 설정
- IOMMU/VT-d 설정
- 하드웨어 문제 확인:
- GPU가 PCIe 슬롯에 제대로 장착되었는지 확인
- 전원 케이블 연결 상태 확인
- 다른 PCIe 슬롯에 시도
6.2 가상 환경에서의 문제 해결
- QXL만 표시되고 물리적 GPU가 표시되지 않는 경우:
- IOMMU 그룹 확인
- 패스스루 구성 확인
- 호스트 커널 매개변수 확인
- GPU 패스스루 오류:
# VFIO 상태 확인
dmesg | grep -i vfio
# IOMMU 그룹 확인
find /sys/kernel/iommu_groups/ -type l | sort -V
# 드라이버 바인딩 확인
lspci -nnk | grep -A3 "VGA\|3D"
6.3 성능 문제 해결
- GPU 온도 및 클럭 속도 확인:
# NVIDIA GPU
nvidia-smi -q -d TEMPERATURE,CLOCK
# AMD GPU
rocm-smi --showtemp --showclocks
- 전력 제한 확인:
nvidia-smi -q -d POWER
- PCIe 링크 상태 확인:
nvidia-smi -q | grep "Link Width"
lspci -vv | grep -A 10 VGA | grep "LnkSta:"
7. 고급 사용 사례
몇 가지 고급 GPU 사용 사례와 구성 방법을 살펴보겠습니다.
7.1 멀티 GPU 딥러닝 환경 구성
딥러닝 워크로드를 위한 멀티 GPU 환경 최적화:
# NCCL(NVIDIA Collective Communications Library) 테스트
/usr/local/cuda/samples/bin/x86_64/linux/release/nccl-tests/all_reduce_perf -b 8 -e 128M -f 2 -g 4
# GPU 간 대역폭 확인
nvidia-smi topo -m
# 최적 NUMA 구성으로 실행
numactl --cpunodebind=0,1 --membind=0,1 python train.py
7.2 GPU 클러스터 관리
대규모 GPU 클러스터 관리를 위한 도구:
- Slurm: HPC 클러스터 관리 시스템에서 GPU 리소스 할당
# GPU 2개 요청하여 작업 제출
sbatch --gres=gpu:2 myjob.sh
- Kubernetes + GPU Operator: 컨테이너화된 환경에서 GPU 관리
# Kubernetes Pod 예시
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: gpu-container
image: nvidia/cuda:11.6.0-base-ubuntu20.04
resources:
limits:
nvidia.com/gpu: 2 # 2개 GPU 요청
7.3 GPU 모니터링 시스템 구축
Prometheus와 Grafana를 이용한 GPU 모니터링 시스템:
- DCGM Exporter 설치: NVIDIA 데이터센터 GPU 메트릭 수집
- Prometheus 구성: GPU 메트릭 스크래핑 설정
- Grafana 대시보드 구성: GPU 사용률, 메모리, 온도 등 시각화
# prometheus.yml 구성 예시
scrape_configs:
- job_name: 'dcgm'
static_configs:
- targets: ['dcgm-exporter:9400']
7.4 GPU 기반 가상 데스크톱 인프라(VDI)
GPU 가속 원격 데스크톱 환경 구성:
- NVIDIA vGPU 또는 GPU 패스스루 설정
- 원격 프로토콜 최적화 (SPICE, RDP, PCoIP 등)
- 원격 3D 애플리케이션 최적화
<!-- GPU 가속 SPICE 구성 예시 -->
<graphics type='spice' autoport='yes'>
<listen type='address' address='0.0.0.0'/>
<image compression='auto_glz'/>
<gl enable='yes'/>
</graphics>
<video>
<model type='virtio' heads='1' primary='yes'>
<acceleration accel3d='yes'/>
</model>
</video>
결론
리눅스 환경에서 물리적 그래픽 카드를 검출하고 관리하는 방법은 시스템 구성 및 용도에 따라 다양합니다. 기본적인 명령어부터 시작하여 가상화 환경, 멀티 GPU 시스템, 고급 관리 기법까지 다양한 방법을 통해 GPU 리소스를 정확히 파악하고 효율적으로 활용할 수 있습니다.
특히 가상화 환경에서는 물리적 GPU와 가상 GPU를 명확히 구분하는 것이 중요하며, 적절한 도구와 명령어를 사용하여 시스템의 정확한 GPU 구성을 파악해야 합니다. 이러한 지식은 고성능 컴퓨팅, 딥러닝, 그래픽 워크스테이션, 가상 데스크톱 인프라 등 다양한 분야에서 시스템 성능을 최적화하는 데 도움이 될 것입니다.
답글 남기기