MIG(Multi-Instance GPU) 는 A100/A30/H100 급 데이터센터 GPU 하나를 메모리와 SM 을 함께 나눈 독립 인스턴스로 쪼갠다. 인스턴스 하나는 Kubernetes 에서 파드 하나에 배타 할당된다. 이 문서는 nvidia-smi 로 MIG 를 만들고, 재부팅 후에도 유지되게 하고, 원래대로 되돌리는 절차와 H100 80GB 의 프로파일 조합을 정리한다.
nvidia-smi --query-gpu=index,name,memory.total,mig.mode.current --format=csv
sudo nvidia-smi -i 0 -mig 1 # MIG 모드 ON (-i 생략 시 전체). Pending 이면 --gpu-reset 또는 재부팅
sudo nvidia-smi mig -i 0 -lgip # GPU Instance 프로파일 목록 (ID·개수 확인)
sudo nvidia-smi mig -i 0 -cgi 3g.40gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb -C # GI + 기본 CI 생성 (-C 없으면 CUDA 실행 불가)
sudo nvidia-smi mig -lgi ; sudo nvidia-smi mig -lci
nvidia-smi -L # MIG-xxxx UUID
CUDA_VISIBLE_DEVICES=MIG-<uuid> python app.py
H100 80GB 프로파일: 1g.10gb×7, 1g.20gb×4, 2g.20gb×3, 3g.40gb×2, 4g.40gb×1. 40GB 슬라이스 하나를 포함해 컴퓨트 7슬라이스 · 메모리 8슬라이스를 모두 쓰는 조합은 정확히 6가지다(예: 3g.40gb + 1g.10gb×4, 2g.20gb×2 + 3g.40gb, 4g.40gb + 2g.20gb + 1g.20gb). 3g 프로파일(ID 9)은 API 알려진 이슈 때문에 생성 목록의 맨 앞에 둔다. 94GB(NVL)/96GB 변종은 프로파일 이름이 3g.47gb 등으로 다르므로 -lgip 결과를 기준으로 한다. 실가용 메모리는 표기보다 적고(1g.10gb ≈ 9.5GB), 프로세스마다 CUDA 컨텍스트 0.3~0.5GB 가 더 든다.
sudo nvidia-smi mig -dci # CI 먼저
sudo nvidia-smi mig -dgi # 그다음 GI
sudo nvidia-smi -mig 0 # 모드 OFF (특정 GPU 는 -i N)
nvidia-smi # MIG M. Disabled, 메모리 전체(81920MiB) 표시
pending 이면 nvidia-smi --gpu-reset -i N, 그래도 device in use 면 nvidia-persistenced · dcgm-exporter · device plugin 을 멈추고 재시도한다. GPU Operator 의 mig-manager 가 관리하는 노드라면 손으로 풀어도 되돌아가므로 nvidia.com/mig.config=all-disabled 라벨로 푼다.
nvidia.com/gpu: 1 로 광고돼 MIG 를 요청하는 파드가 전부 Pending 된다.device plugin 을 유지한 채 systemd 로 복원하는 예시.
# /usr/local/sbin/mig-setup.sh
#!/usr/bin/env bash
set -euo pipefail
GEOMETRY="9,9" # 예: 3g.40gb x 2
for _ in $(seq 1 30); do nvidia-smi -L >/dev/null 2>&1 && break; sleep 2; done
for i in $(nvidia-smi --query-gpu=index --format=csv,noheader); do
nvidia-smi -i "$i" -mig 1
nvidia-smi mig -i "$i" -dci >/dev/null 2>&1 || true
nvidia-smi mig -i "$i" -dgi >/dev/null 2>&1 || true
nvidia-smi mig -i "$i" -cgi "$GEOMETRY" -C
done
# /etc/systemd/system/nvidia-mig-setup.service
[Unit]
Description=Configure NVIDIA MIG geometry at boot
After=nvidia-persistenced.service nvidia-fabricmanager.service
Wants=nvidia-persistenced.service
Before=containerd.service docker.service kubelet.service
ConditionPathExists=/usr/bin/nvidia-smi
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/mig-setup.sh
TimeoutStartSec=300
[Install]
WantedBy=multi-user.target
Before=kubelet.service 가 핵심이다. NVIDIA 공식 방법은 nvidia-mig-manager(mig-parted) 패키지로, /etc/nvidia-mig-manager/config.yaml 에 mig-enabled: true 와 지오메트리를 정의하고 nvidia-mig-parted apply -f ... -c <config> 로 적용·assert 로 검증한다. nvidia_drm 모듈이 로드돼 있으면 GPU 리셋이 막혀 실패할 수 있고, RKE2/ECS 노드에서는 rke2-agent 이름을 Before= 에 쓴다. GPU Operator 를 쓰면 kubectl label node <node> nvidia.com/mig.config=all-1g.10gb --overwrite 라벨만으로 자동 적용·복원된다.
migStrategy 를 mixed 로 두어야 하며 리소스 이름이 nvidia.com/mig-3g.40gb, nvidia.com/mig-1g.10gb 로 갈린다. single 은 모든 파티션이 같은 크기여야 한다. 지오메트리를 바꾼 뒤에는 kubectl rollout restart ds/nvidia-device-plugin-daemonset -n <ns>.sharing.timeSlicing 을 MIG 리소스 타입에 걸 수 있다.3g.20gb 는 메모리 1/4 이지만 연산은 3/7 이므로, "메모리는 남는데 느리다"는 증상이 나온다. 풀 GPU 기준으로 빌드된 TensorRT 엔진은 슬라이스에서 성능이 급감한다.1g.10gb 에 올라가지 않는다. 슬롯에 올릴 모델의 메모리를 먼저 확정한다.