google kubernetes에서 nvidia driver 버전 특정하기
2019-04-08 22:45 KST
Google Kubernetes에서 gpu pool을 사용할 일이 생겨서 클러스터를 새로 생성하는 와중에 nvidia의 드라이버 버전을 최신버전(418)을
써야하는 이슈가 생겼다. (ffmpeg에서 gpu를 써야하는 상황이였는데 cuda버전이 10.1이였어야 했다.)
구글 gpu 문서(https://cloud.google.com/kubernetes-engine/docs/how-to/gpus#installing_drivers)를
보고 따라했지만 nvidia-smi
명령어를 쳐보니 410버전에 cuda 10.0 버전이여서 버전을 변경할 필요가 있어서
DaemonSet을 재설정해서 포드가 생성될때 인젝션 되는 nvidia driver version을 직접 설정해주었다.
기존 DaemonSet
...
initContainers:
- image: "cos-nvidia-installer:fixed"
imagePullPolicy: Never
name: nvidia-driver-installer
resources:
requests:
cpu: 0.15
securityContext:
privileged: true
...
cos-nvidia-installer를 직접 까보면 entrypoint.sh에 nvidia version이 따로 명시되어 있어서 해당 버전만 바꿔주면 된다.
https://github.com/GoogleCloudPlatform/cos-gpu-installer
해당 깃을 clone해서 수정을 해보자..
cos-gpu-installer-docker/entrypoint.sh에서 NVIDIA_DRIVER_VERSION="${NVIDIA_DRIVER_VERSION:-410.79}"
해당 부분을
NVIDIA_DRIVER_VERSION="${NVIDIA_DRIVER_VERSION:-418.40.04}"
로 변경한다.
해당 cos-gpu-installer/cos-gpu-installer-docker 폴더에서 아래 커멘드를 실행해서 이미지를 gcp에 업로드한다.
gcloud buils submit --tag gcr.io/[projectId]/cos-gpu-installer .
DaemonSet을 새로 업로드한 cos-gpu-installer이미지로 설정하고 다시 배포하면 끝.
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nvidia-driver-installer
namespace: kube-system
labels:
k8s-app: nvidia-driver-installer
spec:
template:
metadata:
labels:
name: nvidia-driver-installer
k8s-app: nvidia-driver-installer
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-accelerator
operator: Exists
tolerations:
- operator: "Exists"
hostNetwork: true
hostPID: true
volumes:
- name: dev
hostPath:
path: /dev
- name: nvidia-install-dir-host
hostPath:
path: /home/kubernetes/bin/nvidia
- name: root-mount
hostPath:
path: /
initContainers:
- image: "gcr.io/[project-id]/cos-nvidia-installer"
imagePullPolicy: Never
name: nvidia-driver-installer
resources:
requests:
cpu: 0.15
securityContext:
privileged: true
env:
- name: NVIDIA_INSTALL_DIR_HOST
value: /home/kubernetes/bin/nvidia
- name: NVIDIA_INSTALL_DIR_CONTAINER
value: /usr/local/nvidia
- name: ROOT_MOUNT_DIR
value: /root
volumeMounts:
- name: nvidia-install-dir-host
mountPath: /usr/local/nvidia
- name: dev
mountPath: /dev
- name: root-mount
mountPath: /root
containers:
- image: "gcr.io/google-containers/pause:2.0"
name: pause
cos-gpu-installer에서 쉘 스크립트를 살펴보던 중에 캐시를 활용할 수 있는 것 같은데 추후에 다시 살펴봐야겠다.
gpu 사용할때는 pod에 해당 내용을 추가하면 된다. google kubernetes gpu 문서 항목을 살펴보자.
resources:
limits:
nvidia.com/gpu: 2
gpu사용을 요청하게 되면 포드가 준비되는 시간이 생각보다 오래걸리게 되는데 천천히 기다리면 포드가 준비된다.
포드에 nvidia driver를 설치하는데에 대한 시간인듯 하다..
gpu리소스를 요청하면 포드당 자동으로 gpu-pool이 늘어나고 사용하지 않는 gpu가 있으면 자동으로 풀 사이즈를 줄인다. 참 스마트하다.