딥러닝 네트워크에 맞는 CUDA, cuDNN 버전들이 다르다.
사용 목적에 맞게 CUDA, cuDNN 버전을 가상환경에 설치해보자
구글링+Chat gpt의 힘으로 해결하고 있다.
지금 내가 이런 상태인데, 해결 방법을 다음과 같이 요약해볼 수 있다.
가상환경에 CUDA, cuDNN 설치 -> 가상환경 활성화 할때 환경변수를 적절한 CUDA, cuDNN으로 설정
굳이 Base에 설치된 CUDA, cuDnn을 제거할 필요는 없다
근데 오류가 너무 많이나서 걍 시스템의 CUDA는 지우고 진행
이 둘은 기본적으로 설치햐주자
sudo apt update
sudo apt install cmake
sudo apt install git
conda create -n cuda118 python==3.8
python 3.8이 호환성이 좋다고 해서 3.8로 진행
conda install -c conda-forge cudatoolkit=11.8
이딴걸로 설치하면 nvcc가 제외된 버전으로 설치된다
CUDAtoolkit은 직접 다운해서 설치해야 한다
나는 내가 원하는 위치에 CUDA를 설치하고 싶었다(용량문제)
내 CUDA 설치 위치는/mnt/ssd1t/cuda/11.8
내가 사용할 수 있는 가장 오래된 버전인 11.8 부터 설치했다.
# CUDA 설치 디렉토리 준비
sudo mkdir -p /mnt/ssd1t/cuda/11.8
# CUDA 아카이브 파일 다운로드
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-linux.11.8.0_520.61.05_linux.run
# CUDA Toolkit 설치
sudo sh cuda-linux.11.8.0_520.61.05_linux.run --silent --toolkit --toolkitpath=/mnt/ssd1t/cuda/11.8
# 가상환경 활성화
conda activate cuda118
# 활성화 스크립트 생성 (환경변수 추가+중복된 환경변수 제거(deactivate를 안했을때 중복되서 남아있을 수 있음)
# 필요한 디렉토리 생성
mkdir -p /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d
# env_vars.sh 파일 생성 및 환경변수 설정
echo '#!/bin/sh
export PATH=/mnt/ssd1t/cuda/11.8/bin:$CONDA_PREFIX/bin:$PATH
export LD_LIBRARY_PATH=/mnt/ssd1t/cuda/11.8/lib64:$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=$CONDA_PREFIX
# 중복된 경로 제거
export PATH=$(echo $PATH | tr ':' '\n' | awk "!x[\$0]++" | tr '\n' ':')
export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | awk "!x[\$0]++" | tr '\n' ':')
' > /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d/env_vars.sh
# 스크립트에 실행 권한 부여
chmod +x /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d/env_vars.sh
# 비활성화 스크립트 생성
mkdir -p /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d
echo '#!/bin/sh
export PATH=$(echo "$PATH" | sed -e "s;/mnt/ssd1t/cuda/11.8/bin:;;" -e "s;$CONDA_PREFIX/bin:;;")
export LD_LIBRARY_PATH=$(echo "$LD_LIBRARY_PATH" | sed -e "s;/mnt/ssd1t/cuda/11.8/lib64:;;" -e "s;$CONDA_PREFIX/lib:;;")
export CMAKE_PREFIX_PATH=$(echo "$CMAKE_PREFIX_PATH" | sed -e "s;$CONDA_PREFIX:;;")' > /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d/unset_env_vars.sh
chmod +x /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d/unset_env_vars.sh
# 가상환경 비활성화 및 재활성화
conda deactivate
conda activate cuda118
# nvcc 명령어 확인
nvcc --version
conda install -c conda-forge boost
conda install -c conda-forge eigen
conda install -c conda-forge freeimage
conda install -c conda-forge glog
conda install -c conda-forge gflags
conda install -c conda-forge suitesparse
conda install -c conda-forge ceres-solver
conda install -c conda-forge flann
conda install -c conda-forge lz4-c
conda install -c conda-forge sqlite
conda install -c conda-forge cgal
conda install -c conda-forge qt
conda install -c conda-forge glew
COLMAP을 사용하기 위한 외부 라이브러리 or 패키지들이다
-> COLMAP을 위해 설치한다고 생각하면 될 듯 하다.(보통 requirement로 표현하는 것과 같은 것 같다)
클론 위치: /mnt/ssd1t/ubuntu/colmap
git clone https://github.com/colmap/colmap.git /mnt/ssd1t/ubuntu/colmap
cd /mnt/ssd1t/ubuntu/colmap
mkdir build
cd build
나처럼 가상환경에 빌드 중이라면, Cmake 빌드과정에서 FLANN의 경로가 잘못되어 있어서 오류가 발생한다.
colmap->cmake->
FindFLANN.cmake
FindLZ4.cmake
다음과 같이 수정해주자
수정 전
list(APPEND FLANN_CHECK_INCLUDE_DIRS
${FLANN_INCLUDE_DIR_HINTS}
/usr/include
/usr/local/include
/opt/include
/opt/local/include
)
list(APPEND FLANN_CHECK_LIBRARY_DIRS
${FLANN_LIBRARY_DIR_HINTS}
/usr/lib
/usr/local/lib
/opt/lib
/opt/local/lib
)
수정 후
list(APPEND FLANN_CHECK_INCLUDE_DIRS
${FLANN_INCLUDE_DIR_HINTS}
/usr/include
/usr/local/include
/opt/include
/opt/local/include
/mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include
)
list(APPEND FLANN_CHECK_LIBRARY_DIRS
${FLANN_LIBRARY_DIR_HINTS}
/usr/lib
/usr/local/lib
/opt/lib
/opt/local/lib
/mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib
)
colmap->CMakeLists.txt파일의 맨 아래에
set(SQLite3_INCLUDE_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include)
set(SQLite3_LIBRARY /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib/libsqlite3.so)
set(SQLite3_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118)
find_package(SQLite3 REQUIRED)
include_directories(${SQLite3_INCLUDE_DIR})
link_libraries(${SQLite3_LIBRARY})
set(CGAL_INCLUDE_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include)
set(CGAL_LIBRARY /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib)
set(CGAL_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118)
find_package(CGAL REQUIRED)
include_directories(${CGAL_INCLUDE_DIR})
link_directories(${CGAL_LIBRARY})
set(Qt5_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib/cmake/Qt5)
find_package(Qt5 REQUIRED COMPONENTS Core Widgets OpenGL)
include_directories(${Qt5Widgets_INCLUDE_DIRS})
link_directories(${Qt5Widgets_LIBRARY_DIRS})
add_definitions(${Qt5Widgets_DEFINITIONS})
set(GLEW_INCLUDE_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include)
set(GLEW_LIBRARY /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib/libGLEW.so)
set(GLEW_DIR /mnt/ssd1t/ubuntu/anaconda/envs/cuda118)
find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIR})
link_directories(${GLEW_LIBRARY})
를 추가하자
cmake .. -DCMAKE_C_COMPILER=$(which gcc) -DCMAKE_CXX_COMPILER=$(which g++) -DCUDA_TOOLKIT_ROOT_DIR=$CONDA_PREFIX -DCUDA_HOST_COMPILER=$(which gcc) -DBUILD_TESTING=OFF
make -j$(nproc)
sudo make install
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
colmap gui
colmap
을 사용하면 CLI에서 사용할 수 있지만, 그런 미친짓을 왜? GUI 사용하자
가상환경 활성화 시 환경변수 설정 코드를 자동으로 실행해 주는 방법이다.
아나콘다 환경변수 폴더안에 .sh스크립트를 만들어서 activate, deactivate시 자동으로
환경변수를 설정, 해제 해준다.
위에 CUDA 설치때 이미 스크립트에 넣어놔서 할 필요 ❌
# 활성화 스크립트 생성 mkdir -p /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d echo '#!/bin/sh export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH' > /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d/env_vars.sh chmod +x /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/activate.d/env_vars.sh # 비활성화 스크립트 생성 mkdir -p /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d echo '#!/bin/sh export LD_LIBRARY_PATH=$(echo "$LD_LIBRARY_PATH" | sed -e "s;$CONDA_PREFIX/lib:;;")' > /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d/unset_env_vars.sh chmod +x /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/etc/conda/deactivate.d/unset_env_vars.sh
cuDNN다운(로그인필요)
Local installer for Linux x86_64(Tar)로 설치했다
Ubuntu용은 라이브러리가 더 적다고 하는데, 뭐 그렇다더라
압축풀기
tar -xf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
include, lib 폴더에 있는 파일 옮기기
sudo cp include/cudnn*.h /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include
sudo cp lib/libcudnn* /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib
권한 설정
sudo chmod a+r /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/include/cudnn*.h sudo chmod a+r /mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib/libcudnn*
vim ~/.bashrc
vim으로 bashrc파일을 열어서 내가 사용 할 환경변수 위치만 남겨두고 지우자
vim으로 파일을 열고 i를 누르면 수정이 가능하다
(Ese: 명령모드- : 뒤에 다음 명령어를 입력하면 된다
w: 파일저장, q: vim종료, wq: 저장하고 종료, q!: 저장하지 않고 종료)
# 기존 경로 설정을 제거하고 다음 줄만 남깁니다.
export PATH=/mnt/ssd1t/cuda/11.8/bin:/mnt/ssd1t/ubuntu/anaconda/envs/cuda118/bin:$PATH
export LD_LIBRARY_PATH=/mnt/ssd1t/cuda/11.8/lib64:/mnt/ssd1t/ubuntu/anaconda/envs/cuda118/lib:$LD_LIBRARY_PATH
저장 후 종료
:wq
변경 사항 적용
source ~/.bashrc
나는 Pytorch 1.7.1버전을 사용하려고 한다.
Pytorch와 호환되는 버전을 확인 후 가상환경에 설치해보자
(나는 11.0버전 쓸꺼임)
근데 개같은거 4060ti버전에서는 CUDA11.8부터 지원하기 때문에 사용 불가
conda install -c anaconda cudatoolkit=11.0
다음 코드로 자동으로 설치도 가능하다고 하지만 설치 전에 CUDA와 호환되는 버전인지 확인 후 설치하자
conda install -c anaconda cudnn
conda list cudatoolkit
conda list cudnn
아래 nvidia-cudnn-cu12는 base에 설치된 cuDANN이 인식된 것 같다.
nvcc --version으로 cuda를 확인했을 때도 12.1 버전이 인식되는 것으로 보인다.
현재 CUDA 12.1이 인식되는 이유는 환경변수가 CUDA 12.1 폴더로 되어있기 때문이다.
가상환경을 활성화 한 후, 해당 가상환경의 환경변수를 CUDA 11.0폴더로 바꿔주자
conda list cudatoolkit