CAS 에서 GPU 를 쓰려면 CASDeployment 의 컨트롤러 컨테이너에 NVIDIA 관련 환경변수를 넣는 PatchTransformer 를 site-config 에 두고 kustomize 로 붙인다. 배포 자산의 sas-bases/examples/cas/configure 아래에 GPU 예제가 들어 있다.
클라우드 관리형 쿠버네티스(AKS · EKS · GKE)에서는 장치 플러그인이 GPU 스케줄링을 맡으므로 SAS GPU Reservation Service(sasgpud)가 필요 없는 예제를 쓴다.
kubectl get nodes -o wide
kubectl describe node <gpu-node> | grep -A5 -i 'nvidia.com/gpu'
Capacity 와 Allocatable 에 nvidia.com/gpu 가 잡혀 있어야 한다. 값이 없으면 장치 플러그인이나 드라이버 문제이지 CAS 설정 문제가 아니다.
드라이버와 CUDA 버전은 임시 파드로 확인한다.
kubectl run gpu-check --rm -it --restart=Never --image=nvidia/cuda:12.4.1-base-ubuntu22.04 --overrides='{"spec":{"nodeSelector":{"<gpu-label-key>":"<value>"},"containers":[{"name":"gpu-check","image":"nvidia/cuda:12.4.1-base-ubuntu22.04","command":["sleep","3600"],"resources":{"limits":{"nvidia.com/gpu":1}}}]}}' -- nvidia-smi
파드가 곧바로 Completed 로 끝나 들어갈 수 없으면 명령을 sleep 으로 잡아 두고 kubectl exec 로 들어간다.
배포 자산의 예제에는 네 개의 환경변수가 들어 있다. 이 가운데 둘은 지우는 편이 안전하다.
| 변수 | 판단 |
|---|---|
NVIDIA_DRIVER_CAPABILITIES=all |
유지. compute · utility 등 필요한 기능을 모두 연다 |
SASGPUD_LOG_TYPE=error |
유지. 디버깅이 필요할 때만 info 로 올린다 |
NVIDIA_REQUIRE_CUDA |
제거 권장. 예제 기본값이 arch=pascal arch=volta arch=turing driver>=410.48 라 Ampere(A100) · Hopper(H100) 는 조건에 없다. 조건을 만족하지 못하면 컨테이너 런타임이 기동을 거부한다 |
SAS_USE_LOCAL_SASGPUD=True |
관리형 쿠버네티스에서는 제거. 장치 플러그인이 예약을 담당하므로 예약 서비스가 중복된다 |
특히 NVIDIA_REQUIRE_CUDA 는 노드 이미지가 갱신되면서 드라이버 버전이 바뀌면 조건이 어긋나 나중에 터진다. 조건을 직접 관리할 이유가 없으면 아예 빼는 쪽이 낫다.
site-config/cas/cas-gpu.yaml 로 둔다.
apiVersion: builtin
kind: PatchTransformer
metadata:
name: cas-gpu-vars
patch: |-
- op: add
path: /spec/controllerTemplate/spec/containers/0/env/-
value:
name: NVIDIA_DRIVER_CAPABILITIES
value: all
- op: add
path: /spec/controllerTemplate/spec/containers/0/env/-
value:
name: SASGPUD_LOG_TYPE
value: "error"
target:
group: viya.sas.com
kind: CASDeployment
name: .*
kustomization.yaml 의 transformers 에 등록한다.
transformers:
- site-config/cas/cas-gpu.yaml
GPU 노드로만 CAS 가 가도록 노드 레이블 · 테인트를 함께 잡는다. CAS 워커를 여러 대 띄우는 MPP 구성에서는 워커가 GPU 노드 수를 넘지 않게 맞춘다.
kubectl -n <namespace> get casdeployment -o yaml | grep -A2 NVIDIA
kubectl -n <namespace> exec -it sas-cas-server-default-controller -c cas -- nvidia-smi
GPU 설정과 별개로, CAS 이미지를 SAS 레지스트리에서 받는 단계에서 막히는 일이 잦다. 이미지 pull 은 두 도메인을 쓴다.
cr.sas.com 이미지 메타데이터
recr.unx.sas.com OAuth 토큰 발급
failed to fetch oauth token ... lookup recr.unx.sas.com ... NXDOMAIN 이 찍히면 방화벽이나 NAT 문제가 아니라 DNS 정책에서 그 FQDN 만 차단하고 있는 것이다. 보안 DNS · DNS 프록시의 허용 목록에 recr.unx.sas.com 을 넣어야 한다. 포트를 여는 것으로는 해결되지 않는다.