주녁, DevNote
article thumbnail

개요

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를 설치해보도록 할 것이다.

 


 

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!