가상환경에 CUDA ,cuDNN 설치(COLMAP 따라히지마시오 수정중)

이세돌의망치·2024년 5월 9일
0

사용 목적

딥러닝 네트워크에 맞는 CUDA, cuDNN 버전들이 다르다.
사용 목적에 맞게 CUDA, cuDNN 버전을 가상환경에 설치해보자
구글링+Chat gpt의 힘으로 해결하고 있다.

Base에 이미 CUDA, cuDNN을 설치한 경우

지금 내가 이런 상태인데, 해결 방법을 다음과 같이 요약해볼 수 있다.

가상환경에 CUDA, cuDNN 설치 -> 가상환경 활성화 할때 환경변수를 적절한 CUDA, cuDNN으로 설정
굳이 Base에 설치된 CUDA, cuDnn을 제거할 필요는 없다
근데 오류가 너무 많이나서 걍 시스템의 CUDA는 지우고 진행


CMake, Git 설치

이 둘은 기본적으로 설치햐주자

sudo apt update
sudo apt install cmake
sudo apt install git

Colmap용 가상환경 CUDA 설치

1. 가상환경 만들기

conda create -n cuda118 python==3.8

python 3.8이 호환성이 좋다고 해서 3.8로 진행

2. CUDA & Colmap 설치

1) CUDA설치

conda install <-쓰래기
conda install -c conda-forge cudatoolkit=11.8

이딴걸로 설치하면 nvcc가 제외된 버전으로 설치된다


직접 CUDA Toolkit 다운✅

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

2) COLMAP 의존성 설치

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로 표현하는 것과 같은 것 같다)

3) COLMAP 소스에서 빌드

COLMAP 클론

클론 위치: /mnt/ssd1t/ubuntu/colmap

COLMAP github 버전 참고

git clone https://github.com/colmap/colmap.git /mnt/ssd1t/ubuntu/colmap
COLMAP 디렉토리 설정 (설정한 클론 위치로)
cd /mnt/ssd1t/ubuntu/colmap
mkdir build
cd build
FLANN,FindLZ4 파일 수정

나처럼 가상환경에 빌드 중이라면, 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
)
CMakeLists.txt 파일 수정

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})

를 추가하자

4) CMake 명령 실행

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

5)빌드 및 설치

make -j$(nproc)
sudo make install

3. 환경변수 설정

export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH

4. COLMAP 실행

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 설치

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*

기존의 CUDA 환경변수 지우기

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

/var 에 있는 cuda cudnn 파일 지워야되는지 확인하자

가상환경에 CUDA, cuDNN 설치

나는 Pytorch 1.7.1버전을 사용하려고 한다.
Pytorch와 호환되는 버전을 확인 후 가상환경에 설치해보자
(나는 11.0버전 쓸꺼임)
근데 개같은거 4060ti버전에서는 CUDA11.8부터 지원하기 때문에 사용 불가


Pytorch 이전버전 참고


CUDA 설치

conda install -c anaconda cudatoolkit=11.0

cuDANN 설치

cuDNN버전 확인

다음 코드로 자동으로 설치도 가능하다고 하지만 설치 전에 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폴더로 바꿔주자

CUDA 설치 위치

conda list cudatoolkit

profile
코딩초보

0개의 댓글