이미 돌고 있는 Cloudera Data Services(ECS) 클러스터에 GPU 워커를 추가할 때, 노드를 CM 에 등록하기 전까지 끝내 둬야 하는 것들을 정리한다. 드라이버 버전을 올리는 작업은 ECS GPU 노드 NVIDIA 드라이버 업그레이드 에 따로 있다.
계층은 다섯이고, 아래에서 위로 하나라도 빠지면 nvidia.com/gpu 리소스가 노드에 광고되지 않는다.
| 계층 | 내용 |
|---|---|
| 하드웨어 · 펌웨어 | CUDA 지원 GPU, BIOS 설정, PCIe · 전원 · 냉각 |
| OS | 커널 헤더, 개발 도구, nouveau 비활성화, ECS 공통 요건 |
| 언어 런타임 | CM Agent 용 Python, JDK |
| NVIDIA 스택 | 드라이버, nvidia-container-toolkit |
| CM · Kubernetes | 호스트 등록, GPU 전용 노드 지정, device plugin |
BIOS 에서 확인할 것은 대체로 다음이다. 서버 벤더마다 항목 이름이 다르다.
OS 에서 카드가 보이는지부터 확인한다.
lspci | grep -i nvidia
nvidia-smi # 드라이버 설치 전에는 실패하는 것이 정상이다
# 개발 도구와 커널 헤더 — 실행 중인 커널과 버전이 정확히 같아야 한다
dnf groupinstall -y "Development Tools"
dnf install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) \
elfutils-libelf-devel libglvnd-devel pciutils dkms
# nouveau 비활성화
cat > /etc/modprobe.d/blacklist-nouveau.conf <<'CONF'
blacklist nouveau
options nouveau modeset=0
CONF
dracut --force
커널을 업데이트하면 kernel-devel 도 새 버전을 깔고 드라이버를 다시 빌드해야 한다. dkms 를 쓰면 이 과정이 자동화되지만, 기존 노드가 .run 인스톨러로 설치돼 있으면 같은 방식을 유지하는 편이 혼선이 적다.
ECS 워커 공통 요건도 같이 맞춘다.
nfs-utils, iscsi-initiator-utils 설치/var/lib 여유 공간 (이미지 · 컨테이너 레이어가 여기 쌓인다)net.ipv4.ip_forward=1필요한 최소 여유 공간과 IPv6 요구가 시작된 정확한 릴리스는 확인하지 못했다 (확인 필요). 설치 전 해당 버전의 ECS software requirements 문서를 확인한다.
CM Agent 는 시스템 기본 Python 으로 동작하지 않는 경우가 많다. RHEL 8 계열은 AppStream 의 별도 스트림을 깐다.
dnf install -y python3.11 python3.11-pip
여기서 핵심은 버전 선택이 아니라 클러스터 전체에서 같은 버전을 쓰는 것이다. 기존 워커가 3.8 · 3.9 로 돌고 있으면 새 노드만 3.11 로 올리지 않는다. CM 버전이 지원하는 Python 버전 목록은 릴리스마다 다르므로 CM 의 Python guidelines 문서에서 대조한다.
JDK 도 같다. 기존 노드와 같은 계열 · 같은 메이저 버전을 깔고 alternatives 로 JAVA_HOME 을 맞춘다. GPU 노드에서 JDK 는 CM Agent 와 파셀용이며, 컨테이너 워크로드가 쓰는 런타임과는 별개다.
저장소를 등록해 설치하는 경로는 다음과 같다.
# EPEL
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# NVIDIA CUDA 저장소 (RHEL 8)
dnf config-manager --add-repo \
https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
# NVIDIA Container Toolkit 저장소
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
-o /etc/yum.repos.d/nvidia-container-toolkit.repo
dnf install -y nvidia-container-toolkit
드라이버는 저장소 패키지 또는 .run 인스톨러 중 기존 노드와 같은 방식을 쓴다. 두 방식이 섞이면 나중에 업그레이드할 때 모듈과 패키지가 어긋난다.
설치 후 다음 순서로 확인한다.
systemctl enable --now nvidia-persistenced
nvidia-smi # 드라이버 버전과 지원 CUDA 버전
nvidia-ctk --version
nvidia-container-cli info
nvidia-container-runtime 은 nvidia-container-toolkit 으로 통합됐다. 옛 문서를 보고 따로 설치하지 않는다.
드라이버 버전은 서빙 이미지가 요구하는 CUDA 를 기준으로 고른다. Cloudera 문서의 ML Runtime 검증 버전만 보고 맞추면, 더 최신 CUDA 로 빌드된 추론 이미지에서 CUDA Error 803 이 난다. 이 증상과 업그레이드 절차는 ECS GPU 노드 NVIDIA 드라이버 업그레이드 에 있다.
노드를 CM 에 붙인 뒤에는 호스트 구성에서 GPU 전용 노드로 표시한다. 이 설정이 노드에 nvidia.com/gpu taint 를 걸어 일반 워크로드가 GPU 노드를 차지하지 않게 한다. OpenShift 환경은 taint 를 수동으로 건다.
드라이버가 정상이면 NVIDIA device plugin 이 리소스를 광고한다.
kubectl get nodes -o custom-columns=NAME:.metadata.name,GPU:.status.allocatable.'nvidia\.com/gpu'
kubectl describe node <gpu-node> | grep -A5 Taints
device plugin 과 GPU Operator 중 무엇을 쓸지는 NVIDIA device plugin 과 GPU Operator 를, MIG 분할은 CAI 추론 GPU taint 와 MIG 제한 을 본다.
[ ] lspci 에 GPU 가 보인다
[ ] BIOS: Above 4G Decoding 활성, Secure Boot 정책 결정
[ ] kernel-devel / kernel-headers 가 uname -r 과 같은 버전
[ ] nouveau 블랙리스트 + dracut 후 재부팅
[ ] nfs-utils, iscsi-initiator-utils, IPv6, ip_forward, chrony
[ ] Python 버전이 기존 노드와 동일
[ ] JDK 버전이 기존 노드와 동일
[ ] 드라이버 설치 방식이 기존 노드와 동일
[ ] nvidia-smi / nvidia-container-cli info 성공
[ ] CM 등록 후 GPU 전용 노드 지정, kubectl 로 nvidia.com/gpu 확인