주녁, DevNote
article thumbnail

1. 개요

Kubeflow를 통해 ML Ops 생태계를 이해하고, 전 주기 파이프라인를 구성해본다.

2. 목표

  • CentOS 7 기준 GPU 관련 환경을 구성해본다.
  • GPU를 이용한 기본적은 Pod Deploy를 진행해본다.

3. 여정

3.1. 워커노드에 Graphic Driver 설치

<bash />
# 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

3.1.1.  


3.2. 워커노드에 Docker 및 Nvidia Docker설치

<bash />
# 워커 노드에서 # 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

 


3.3. 마스터 노드에서 Nvidia 플러그인 적용

Nvidia 플러그인은 yaml 파일에서 nvidia 관련 설정을 인식 및 적용할 수 있게 해준다.

<bash />
# 마스터 노드에 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

3.4. 테스트용 Pod 배포

<bash />
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

3.5. Q & A

  • Nvidia 그래픽 드라이버를 완전히 삭제하고 싶어요
<bash />
# 플러그인 설치전 드라이버 종속성 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 버전만 올리고 싶어요
<bash />
# 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를 배포시키고 싶어요
<bash />
# 특정 Node에 라벨 부여 kubectl label node ${노드 이름} ${key}=${value} ex) kubectl label node ${노드 이름} cuda=12 # Deployment에 NodeSelector 추가 kind: Deployment ... spec: ... spec: nodeSelector: gpu: "cuda"

4. 마무리

이번 시간에는 Kubeflow에서 사용할 GPU Node 설정을 진행하였다.

GPU Node는 Machine Learning Pod들을 사용해 ML Pipeline 구성할 수 있게 해준다.

 

다음편에서는 Kubeflow를 설치해보도록 할 것이다.

 


 

profile

주녁, DevNote

@junwork

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