개요
Kubeflow를 통해 ML Ops 생태계를 이해하고, 전 주기 파이프라인를 구성해본다.
목표
- CentOS 7 기준 GPU 관련 환경을 구성해본다.
- GPU를 이용한 기본적은 Pod Deploy를 진행해본다.
여정
워커노드에 Graphic Driver 설치
# driver init
# 리눅스 버전 확인
sudo uname -a
sudo hostnamectl
cat /etc/redhat-release
sudo yum update -y
sudo yum group install -y "Development Tools" # "Development Tools" - 개발 툴 라이브러리 그룹 설치
sudo yum install -y kernel-devel # kernel-devel - 커널패키지 대해 빌드를 모듈하기 위해 커널헤더와 충분한 파일을 제공
sudo yum install -y epel-release # 리눅스 추가 패키지 설치
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 리눅스 추가 패키지 설치
sudo yum install -y dkms # dkms - nvidia 모듈을 생성
sudo yum install -y lshw
# Nvidia 기본 드라이버(nouveau) 설정 해제
# GRUB_CMDLINE_LINUX 줄에 nouveau.modeset=0 추가
sudo vi /etc/default/grub
# 설정 적용
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
# 재부팅 후 적용 확인
# configuration 항목에 nouveau가 없으면 정상
lshw -numeric -C display
# Nvidia 드라이버 다운로드
# Tesla P100, K80 : 버전 470.161.03 / Cuda 툴킷 11.4
# Tesla T4 : 버전 525.85.12 / Cuda 툴킷 12.0
sudo wget https://us.download.nvidia.com/tesla/${드라이버_버전}/NVIDIA-Linux-x86_64-${드라이버_버전}.run
sudo wget https://us.download.nvidia.com/tesla/470.161.03/NVIDIA-Linux-x86_64-470.161.03.r
sudo sh NVIDIA-Linux-x86_64_${드라이버_버전}.run
# 설치 중 나오는 문구는 전부 OK로 진행한다.
# 설치 결과 확인
sudo nvidia-smi
워커노드에 Docker 및 Nvidia Docker설치
# 워커 노드에서
# Docker 설치
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo yum -y install nvidia-docker2
# Docker Engine 실행
systemctl enable docker --now
# Docker 설치확인
systemctl status docker
# Docker를 사용하거나 k8s의 CRI로 사용한다면 설정한다.
# Docker 설정이 아래 내용을 포함한다면 정상
vi /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
# Nvidia가 컨테이너 상에서 동작하는지 확인
# nvidia-smi와 동일한 출력이 나와야 정상
sudo docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all ubuntu nvidia-smi
마스터 노드에서 Nvidia 플러그인 적용
Nvidia 플러그인은 yaml 파일에서 nvidia 관련 설정을 인식 및 적용할 수 있게 해준다.
# 마스터 노드에 Nvidia 플러그인 설치
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvdp nvdp/nvidia-device-plugin \
--namespace nvidia-device-plugin \
--create-namespace \
--set migStrategy=single \
--version 0.13.0
# 결과 확인
kubectl get node ${GPU 노드명}
...
Capacity:
cpu: 40
ephemeral-storage: 434552516Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 263558512Ki
nvidia.com/gpu: 1 # 총 GPU 갯수
pods: 110
Allocatable:
cpu: 40
ephemeral-storage: 400483598083
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 263456112Ki
nvidia.com/gpu: 1 # 사용가능한 GPU 갯수
pods: 110
# 실행하려는 Pod.yaml에서
# 아래와 같은 문법 사용 가능
---
kind: Pod
...
spec:
containers:
- name: ...
image: ...
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 GPU
테스트용 Pod 배포
vi test.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
namespace: nlp-test
spec:
restartPolicy: Never
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2 # 공식 테스트 이미지
resources:
limits:
nvidia.com/gpu: "1" # requesting 1 GPU
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
Q & A
- Nvidia 그래픽 드라이버를 완전히 삭제하고 싶어요
# 플러그인 설치전 드라이버 종속성 Unload
# Nvidia 드라이버 목록 확인
lsmod | grep nvidia
# 드라이버 unload
sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia_uvm
sudo rmmod nvidia
# 프로세스가 실행중이라면
# 아래 명령어로 확인 후 kill
sudo lsof /dev/nvidia*
kill -9 ${PID}
# 아래 명령어로 아무 결과가 안나오면 정상
lsmod | grep nvidia
# 드라이버 삭제
sudo /usr/bin/nvidia-uninstall
- Cuda 버전만 올리고 싶어요
# Cuda 드라이버 다운로드
# https://developer.nvidia.com/cuda-toolkit-archive
# CUDA 버전 11.6 이상으로 설치
wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run
sudo sh cuda_11.6.2_510.47.03_linux.run
# 화면 표시까지 1분가량 시간이 걸리니 대기한다.
# 1. 기존 Nvidia를 지울것인지 : Continue
# 2. 약관 동의 : accept 입력
# 3. 설치 항목 : Driver 항목만 X표시 해제 후 Install
- 특정 GPU Node에만 Pod를 배포시키고 싶어요
# 특정 Node에 라벨 부여
kubectl label node ${노드 이름} ${key}=${value}
ex) kubectl label node ${노드 이름} cuda=12
# Deployment에 NodeSelector 추가
kind: Deployment
...
spec:
...
spec:
nodeSelector:
gpu: "cuda"
마무리
이번 시간에는 Kubeflow에서 사용할 GPU Node 설정을 진행하였다.
GPU Node는 Machine Learning Pod들을 사용해 ML Pipeline 구성할 수 있게 해준다.
다음편에서는 Kubeflow를 설치해보도록 할 것이다.
'DevOps' 카테고리의 다른 글
Kubeflow 라이징 - Kiali로 Service Mesh 모니터링하기 (0) | 2023.03.10 |
---|---|
Kubeflow 라이징 - Kubeflow 설치 및 대시보드 접속 (0) | 2023.03.04 |
Kubeflow 라이징 - ML Ops와 Service Mesh 훑어보기 (0) | 2023.02.24 |
CI/CD Pipeline - 클러스터에 Private 저장소 이미지 배포하기 (0) | 2023.02.23 |
CKA 뽀개기 - Application Multi Container Issue (0) | 2023.02.21 |