Kubernetes 컨테이너에서 MIG 활성화된 GPU 메모리 정보를 안전하게 조회하기
게시:
멀티 테넌트 클러스터에서 NVIDIA H100 같은 MIG를 지원하는 GPU를
MIG(Multi‑Instance GPU) 모드로 분할해 사용하면,
컨테이너 내부에서 nvidia-smi 또는 PyNVML 로 전체 GPU(Parent GPU) 메모리 정보를
조회할 때 Insufficient Permissions 오류가 발생할 수 있습니다.
이 글에서는
- 오류가 발생하는 구조적 이유
- 컨테이너에 MIG 모니터 권한을 부여해 문제를 해결하는 방법
- 보안 관점의 모범 사례
를 단계별로 설명합니다.
1. 증상 재현
1‑1. nvidia-smi 오류
$ nvidia-smi --query-gpu=gpu_name,memory.total --format=csv,noheader
NVIDIA A100-PCIE-80GB, [Insufficient Permissions]
NVIDIA A100-PCIE-80GB, 81920 MiB
...
1‑2. PyNVML 오류
handle = pynvml.nvmlDeviceGetHandleByIndex(0)
pynvml.nvmlDeviceGetMemoryInfo(handle)
# → pynvml.nvml.NVMLError_NoPermission: Insufficient Permissions
Parent GPU를 호출하면 NVML 이 NVML_ERROR_NO_PERMISSION 을 반환하기
때문입니다.
2. 원인
NVML 보안 모델
MIG 모드에서는 물리적 GPU가 여러 개의 독립적인 GPU 인스턴스(GI) 및 컴퓨트 인스턴스(CI)로 분할됩니다.
GPU 인스턴스
각 GI는 자체적인 메모리 컨트롤러, L2 캐시 뱅크, 스트리밍 멀티프로세서(SM) 슬라이스 등을 포함하여 격리된 리소스를 가집니다.
그런데 만약 Parent GPU의 집계 메모리를 노출하면 격리 보장이 깨질 수 있기 때문에 쿠버네티스 파드와 같은 컨테이너 환경에서 MIG 장치를 사용할 때 컨테이너는 일반적으로 할당된 특정 MIG 인스턴스(GI 및 CI)에 대한 접근 권한만 부여받습니다.
따라서 MIG mode Enabled 상태의 GPU에서 memory.total과 같은 물리적 GPU 전체 속성을 쿼리하려 할 때, 컨테이너에 해당 물리적 GPU에 대한 완전한 접근 권한이 부여되지 않았다면 Insufficient Permissions 오류가 발생하는 것입니다.
컨테이너 런타임
nvidia-container-runtime 은 기본적으로 compute,utility capability 만 컨테이너에 전달하며, MIG monitor 관련 capability 는 전달하지 않습니다.
호스트 vs 컨테이너
호스트의 root 프로세스에는 CAP_SYS_ADMIN 및 monitor capability 가 존재하지만, 컨테이너는 별도 설정이 없으면 권한이 부족합니다.
3. 해결 방법
컨테이너 런타임이 MIG 장치에 대한 모니터링 인터페이스 접근을 컨테이너 내부로 명시적으로 허용하도록 지시하는 환경변수를 추가합니다.
이 기능을 사용하려면 컨테이너를 CAP_SYS_ADMIN으로 시작해야 합니다.
- 컨테이너에 CAP_SYS_ADMIN(또는
privileged:true) 부여 - 환경변수
NVIDIA_MIG_MONITOR_DEVICES=all추가
NVIDIA_DRIVER_CAPABILITIES 환경변수
이 환경변수에 설정 가능한 값은compute,compute32,graphics,utility,video,display와all입니다. 따라서NVIDIA_DRIVER_CAPABILITIES=all설정해도mig-monitor권한은 추가되지 않습니다.
YAML 예시
apiVersion: v1
kind: Pod
metadata:
name: gpu-monitor
spec:
runtimeClassName: nvidia # GPU 런타임(선택)
containers:
- name: gpu-monitor-container
image: nvidia/cuda:12.9.0-base-ubuntu22.04
command: ["nvidia-smi", "--query-gpu=gpu_name,memory.total", "--format=csv"]
env:
- name: NVIDIA_MIG_MONITOR_DEVICES
value: "all" # 핵심 설정
securityContext:
capabilities:
add: ["SYS_ADMIN"]
실행 결과
$ kubectl exec -it gpu-monitor -- nvidia-smi --query-gpu=gpu_name,memory.total --format=csv,noheader
NVIDIA A100-PCIE-80GB, 81920 MiB
NVIDIA A100-PCIE-80GB, 81920 MiB
...
PyNVML 호출도 동일하게 정상 동작합니다.
4. 마무리
- Insufficient Permissions 오류는 버그가 아니라 NVML 보안 설계입니다.
- 컨테이너에서 Parent GPU 메모리를 조회하려면
CAP_SYS_ADMIN+NVIDIA_MIG_MONITOR_DEVICES=all만으로 충분합니다. - 운영 환경에서는 모니터링용 컨테이너에만 권한을 부여해 원칙 – 최소 권한(Least Privilege) 을 지키는 것이 좋습니다.
댓글남기기