본문 바로가기

Engineering/Env Setting

[CUDA] 가상환경 Complete CUDA Installation

CUDA's 2 API ( Driver & Runtime )

CUDA의 버전을 확인하기 위한 Command로 nvidia-smi와 nvcc --version을 많이 봤을 것이다. 둘은 어떤 것이 다른 것일까? CUDA는 2개의 api를 가지고 있다. 바로 Driver API와 Runtime API이다. 일반적으로 nvidia-smi를 통해서 확인하는 것은 Driver api이고 nvcc --version을 통해서 확인하는 것은 runtime api이다. 이 둘이 뱉는 cuda버전은 일반적으로 일치하지 않는 경우가 많다.

즉, Nvidia의 GPU를 사용하는 컴퓨터를 사고 준비할 때 GPU Driver Install을 하게 되는데 이때 설치된 GPU Driver의 버전이 nvidia-smi에 나오는 것이다. 이는 Runtima API와 연결되어 있지 않다. nvcc 즉 CUDA toolkit과 함께 설치되는 컴파일러는 실제 runtime에서 cuda 프로그램을 사용할 때의 cuda 버전을 가리킨다. 따라서, GPU Driver의 설치된 버전을 알 수도 없고, 서로를 반영하지 않는다. 따라서 일반적으로 우리는 nvcc --version을 통해 주로 runtime api를 확인하게 되다. 

이는 실제로 도커 컨테이너 위에서 구성된 서버를 사용할 때도 체크할 수 있는데, 해당 서버에 SSH로 접속하였을 때 CUDA 버전을 확인하고 싶다면 어떻게 해야 할까? 우선 nvidia-smi를 하게 되면 이 도커 컨테이너가 있는 기본 시스템에 설치된 GPU Driver의 버전을 리턴하다. 반면, nvcc --version을 사용하게 되면 도커 컨테이너 내부에 설치된 CUDA 버전을 보고하게 된다.

Incompletely CUDA Toolkit

그런데, 보통 Pytorch를 Install할 때 CUDA Version에 맞게 설치해줘야 하기에 일반적으로 가상 환경 내에서 다음과 같은 command( ex - conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch)를 통해서 Torch를 설치하고 CUDA버전을 이에 맞춰주게 된다. 일반적으로 사람들은 cudatoolkit의 버전만 torch와 compatible 하면 된다고 알고 있다. ( cuda toolkit이란 gpu사용을 위한 라이브러리, 컴파일러 등을 제공해주는 툴킷이다. ) 하지만, 위와 같은 command를 통해 설치한 cuda toolkit은 완전한 cuda toolkit이 아니다. 핵심적인 문제점 중 하나는 NVCC( Nvidia CUDA Compiler )가 설치되지 않는다는 것이다.

따라서 그저 pytorch사용을 위한 상황이라면 위와 같은 command를 통해서 pytorch 버전과 compatible하게 cuda toolkit을 설치해줘도 큰 문제가 없지만, 내부적으로 CUDA 프로그래밍을 써야 해서 cu확장자의 파일을 써야 한다든지 pytorch가 cuda를 사용하는 것뿐이 아니라 cuda programming language로 구성된 파일이 돌아가야 해서 NVCC( Nvidia CUDA Compiler )가 필요한 경우에는 문제가 발생한다.

결국 nvcc의 사용을 원한다면 더 나아가서 완전한 cuda toolkit을 설치하고자 한다면, 환경에 맞게 직접 run파일을 직접 설치해주고 run해주는 것이 안정적이다. 다음과 같은 command를 참고하자. 이는 10.2 버전을 설치하는 것이다.

$ wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
$ sh ./cuda_10.2.89_440.33.01_linux.run --no-opengl-libs --toolkit --silent --override

<NEW!!>

사실 위 프로세스를 사용하지 않은지 꽤 오래되었다. 위 프로세스보다 훨씬 간단히 cuda command를 통해 stable하게 cuda dev toolkit을 설치할 수 있다. 본 글에서 하고자하는 바를 관통하는 간단한 stackoverflow글은 첫번째 링크를 cudatoolkit-dev를 설치는 2번째 링크를 refer하면 된다.

 

GitHub - conda-forge/cudatoolkit-dev-feedstock: A conda-smithy repository for cudatoolkit-dev.

A conda-smithy repository for cudatoolkit-dev. Contribute to conda-forge/cudatoolkit-dev-feedstock development by creating an account on GitHub.

github.com

Check CUDA

그런데 가상환경을 activate 한 상태에서 nvcc --version을 사용하게 되면 우리가 가상환경에 설치한 cuda의 버전이 아닌 base에 설치된 cuda버전이 나오게 된다. 이는 nvcc --version이 찾는 nvcc가 base환경에서 찾도록 되어 있기 때문이다. 따라서 앞서 살펴봤던 대로 직접 cuda toolkit을 설치해줘야 하고 그 후 conda env에서 cuda toolkit의 버전을 확인함으로써 nvcc까지 버전에 맞게 잘 설치된 cuda toolkit의 버전을 확인할 수 있다. ( conda env list )

참고로 CUDA_HOME 환경변수가 이번에 설치한 CUDA버전에 맞게 잘 되고 있는지를 체크해줘야 한다. 만약 문제가 생긴다면 shell configuration file인 .bashrc나 .zshrc에 export CUDA_HOME={}에 설치된 nvcc의 위치를 적어주자. 이때 nvcc가 들어간 경로를 다음과 같은 command( sudo find / -name nvcc )를 통해서 모두 확인해볼 수 있고, 원하는 nvcc에 맞게 경로를 설정해주면 된다. export를 통해서 환경변수 설정이 잘 되었는지 마지막으로 한번 더 체크해주자.

다음은 필자의 환경에서 찾은 nvcc 경로들이다. 이를 CUDA_HOME에 넣어주면 되겠다.

(venv) kmuvcl09@kmuvcl09-Ubuntu:~/pytorch3d$ sudo find / -name nvcc
/usr/bin/nvcc
/usr/lib/nvidia-cuda-toolkit/bin/nvcc
/usr/local/cuda-10.2/bin/nvcc

 

이렇게 되면 가상환경에 완전한 CUDA를 설치해서 사용할 준비를 마쳤다고 볼 수 있다!

 

References