워크스테이션 CUDA 환경 구축

노하람·2022년 4월 13일
0
post-thumbnail
  • 차후에 진행될 워크스테이션 내 CUDA 환경 구축기를 기록합니다.

Python, Pytorch, Cuda, cuDnn 등

가상환경

워크스테이션에 현대위아 프로젝트를 위한 개발환경만 운용하므로, 가상환경을 별도로 구축하지 않습니다.

네트워크 연결

Linux를 처음 설치한 상태라면 네트워크 설정이 안되어 있는 경우가 있습니다.
1. 랜선(혹은 와이파이)가 이더넷에서 연결된 상태인지 확인합니다.

# ifconfig를 통해 이더넷 이름을 확인합시다.
$ ifconfig

# 제일 하단에 Link detected: yes 인지 확인합니다. no면 랜선 등이 인식되지 않은 경우입니다.
$ ethtool eno1

#네트워크 설정을 변경하고 네트워크 서비스를 재시작합니다. 네트워크 설정 yaml 파일명이 다양하니 안에 존재하는 파일명을 사용해주세요.
$ sudo vim /etc/netplan/<안에 존재하는 yaml파일>

저는 네트워크 설정에 주석이 있었습니다. 예를 들어 아래와 같습니다. 주석을 해제한 뒤 저장하고 네트워크 서비스를 재시작시켜보겠습니다.

network:
	version:2
    renderer: NetworkManager
    # ethernets:
    # eno1:
    	# dhcp4: true
        # optional: true

수정 후 sudo netplan apply를 통해 변경사항을 적용합니다.
시스템(Linux)를 종류 후 재시작합니다.

참고로 저는 허브의 전원을 콘센트에 안 꽂아놔서 발생하는 네트워크 에러였습니다...하하하..

Python 설치

$ sudo apt update
$ sudo apt install python3.8
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
$ update-alternatives --config python
$ python -V
$ python3.8 -m pip install pip
$ which python3
$ vim ~/.profile
$ sudo apt-get install -y python3-dev
$ sudo apt-get install -y python3-setuptools

export PATH=/usr/bin/python3.8:$PATH
:wq!

$ source ~/.profile

# 아래껀 setuptools 오류났을 때 실행합니다.
$ sudo -H pip3 install --upgrade --ignore-installed pip setuptools

GPU 정보

도커 세팅

Install

  1. 저장소 설정

    $ sudo apt-get update
    
    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  2. Docker의 공식 GPG 키 추가

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo -H gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  3. 안정적인 저장소를 설정합니다.

설치하기 전에 Architecture 버전을 확인합니다!
$ dpkg -s libc6 | grep Arch

  • Architecture: amd64

  • Multi-Arch: same

    echo \
      "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • x86_64 / amd64

    echo \
      "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 도커 엔진 설치 : 도커 ce 등이 모두 최신 버전으로 설치됩니다. 특정 버전을 설치하려면 상단의 docker 홈페이지를 참고해주세요!

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io

권한 변경

  1. 일반 사용자계정으로 docker 명령어를 사용하기 위해서는 아래의 명령어로 그룹을 추가

    $ sudo usermod -aG docker $USER

CUDA 세팅

기설치된 CUDA, nvidia-driver 삭제

sudo apt-get --purge -y remove 'cuda*'
sudo apt-get --purge -y remove 'nvidia*'
sudo apt-get --purge -y remove "*nvidia*"
sudo apt-get autoremove --purge cuda
sudo rm -rf /usr/local/cuda*

sudo /usr/local/cuda-11.2/bin
sudo /usr/bin/nvidia-uninstall
  • 11.2 버전을 설치하겠습니다.

쿠다 툴킷 설치

편의를 위해 NVIDIA 드라이버는 CUDA Toolkit 설치의 일부로 설치됩니다. 이 드라이버는 개발용이며 Tesla GPU를 사용한 프로덕션 환경에서는 사용하지 않는 것이 좋습니다.

wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run
sudo sh cuda_11.2.0_460.27.04_linux.run

GPU 인식 확인

정상적으로 설치되었다면 다음 명령을 통해 아래와 같이 GPU 상태를 확인할 수 있습니다.
- nvidia-smi

NVIDIA-docker 설치

  1. 다음 명령어를 실행하여 설치합니다.
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit nvidia-container-runtime
sudo systemctl restart docker
  1. 정상설치 확인을 위해 다음 명령을 실행합니다. 자신의 cuda 버전에 따라 tag를 x.0-base로 변경해주세요.
    docker run -it --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

    현재 GPU 를 사용하고 있는 Process 가 하나도 없다고 나오는 것이 이상하게 생각되실 수 있지만, docker 입장에서는 독립된 자기 자신의 내부 프로세스만 확인할 수 있기 때문에 이는 정상적인 상황입니다.

docker default-runtime 변경

Minikube 는 docker default-runtime 을 Docker-CE 로 사용하지만, docker container 내에서 NVIDIA GPU 를 사용하기 위해서는 nvidia-docker 라는 docker-runtime 으로 docker container 를 생성해야 합니다.

  • nvidia-docker : 간단히 말하면 Docker-CE 의 확장판

따라서 Minikube 가 nvidia-docker 로 pod 내부의 container 를 생성할 수 있도록 호스트의 default-runtime 설정을 변경해주어야 합니다.

docker daemon config file 을 다음과 같이 수정합니다.
1. vim /etc/docker/daemon.json

{
  "default-runtime": "nvidia",
  "runtimes": {
      "nvidia": {
          "path": "nvidia-container-runtime",
          "runtimeArgs": []
   }
  }
}
  1. 수정 후 docker 를 재시작합니다.
    sudo systemctl daemon-reload
    sudo service docker restart

cuDNN 다운로드

링크
CUDA 11.x, 10.x 버전만 달리하여 다운로드합니다.

pytorch-gpu 세팅

pytorch는 코드 내에서 CUDA 세팅 (.cuda()) 등 을 진행하면 nvidia driver가 인식되면 gpu를 사용합니다.
추가적인 프레임워크 단에서의 세팅이 필요하진 않습니다.
세팅이 완료된 후 아래 코드를 실행하여 GPU 세팅이 완벽한지 확인합니다.

import torch
torch.cuda.get_device_name(0)
torch.cuda.is_available()
torch.__version__

TensorRT 설치

현재 CUDA 11.7 버전을 설치했으므로, TensorRT 최신버전은 CUDA 11.6버전까지 지원하니까 최신 버전을 설치합니다.
Nvidia 포럼을 확인해본 결과 동작을 보증할 순 없지만 유연한 동작이 가능할 것이라고 합니다.
다운로드 튜토리얼
여기서 Nvidia TensorRT 다운로드 링크로 들어가, OS, CUDA 버전 등에 적합한 버전의 Deb(데비안) 설치파일을 다운로드합니다.

  1. OS와 버전이 적합한 deb 파일을 다운로드하고 SFTP로 워크스테이션내로 파일을 옮깁니다.
os="ubuntuxx04"
tag="cudax.x-trt8.x.x.x-ea-yyyymmdd"
sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-repo-${os}-${tag}/*.pub

sudo apt-get update
sudo apt-get install tensorrt

python3 -m pip install numpy
sudo apt-get install python3-libnvinfer-dev

python3 -m pip install protobuf
sudo apt-get install uff-converter-tf

python3 -m pip install numpy onnx
sudo apt-get install onnx-graphsurgeon
  1. 설치가 잘 되었나 확인합니다.
    dpkg -l | grep TensorRT
  1. trtexec 명령을 사용하기 위해선 별도로 빌드가 필요합니다.
cd /usr/src/tensorrt/samples/trtexec
sudo make
../../bin/trtexec

trtexec 명령이 ../../bin/trtexec로 실행할 수 있는 것을 확인할 수 있습니다. 별칭을 이용해봅시다.
vim ~/.bashrc

마지막 줄에 alias trtexec=/usr/src/tensorrt/bin/trtexec 를 등록하고 :wq! 로 저장하고 나와주세요.
source ~/.bashrc : 변경사항을 적용합니다.

이제 trtexec 명령이 정상적으로 동작하는 것을 확인할 수 있습니다!

드디어 CUDA, Nvidia Driver, cuDNN, ONNX, TensorRT를 모두 설치하고 동작하는 것이 확인되었습니다!!

이슈 해결

ERROR: An NVIDIA kernel module 'nvidia-drm' appears to already be loaded in your kernel.

systemctl isolate multi-user.target
modprobe -r nvidia-drm
lsof /dev/nvidia*
systemctl start graphical.target

실행 후 재설치(기존 엔비디아 드라이버 프로세스 삭제)

쿠다 설치 시 nvidia-drm 관련 오류

링크 참고하여 해결

profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글