Search
Duplicate

LibTorch/ Window에서 LibTorch 설치 및 Visual Studio 세팅

이 글은 PyTorch GPU 버전을 C++에서 돌리기 위한 LibTorch 세팅에 대한 글이다. —CPU 버전은 GPU 버전이 세팅되면 바로 사용 가능하며, GPU 버전을 위한 추가 세팅 작업을 하지 않아도 사용 가능하다.

설치

PyTorch 공식 홈페이지에 들어가서 스크롤을 내리면 필요한 LibTorch 라이브러리를 받을 수 있다.
Stable, Windows, LibTorch, C++, CUDA 11.3 버전을 선택하면 라이브러리 압축 파일 경로가 나오는데, Debug, Release 버전이 구분 된다. 여기서는 둘 다 받는다. —당연한 얘기지만 컴퓨터에 CUDA 11.3 버전 이상이 설치되어 있어야 한다.
2가지 버전의 압축을 풀면, libtorch라는 같은 이름으로 폴더 구성이 되어 있기 때문에 2가지 버전을 다 사용하기 위해서 다음과 같이 하나의 LibTorch 폴더에 Debug, Release 폴더를 갖는 구조를 정리하고, 자신이 원하는 경로로 옮겨 둔다. —개인적으로는 root 경로에 둠

Window 환경변수 등록

주의) 아래 내용은 Debug, Release를 모두 등록하는 것으로 되어 있지만, LibTorch는 Debug와 Release의 라이브러리 이름이 동일하기 때문에 둘 중 하나는 무시될 수 있다. 배포 환경에서는 Release만 세팅하는 것을 추천.
이후 설정의 편의를 위해 환경변수를 만든다.
새로운 환경 변수를 만들었으면 환경 변수의 Path에도 등록한다.
환경변수에 등록한 것이 반영이 되지 않았다면 윈도우를 재시작하거나 CMD에서 set을 입력하면 반영된다.

Visual Studio에 세팅

기본적으로 Visual Studio에서 C++ 라이브러리를 추가할 때 사용하는 절차를 따르지만, 추가로 해야 하는 작업이 몇 개 있다. —대신 TensorRT 세팅 때와 달리 CUDA는 별도로 Include 해주지 않아도 되는데, 이는 LibTorch 라이브러리가 자체적으로 CUDA를 사용하고 있기 때문.
1.
속성을 재사용하기 위한 props 파일 생성
Visual Studio에서 보기 → 다른 창 → 속성 관리자를 선택해서 속성창을 연다.
속성을 추가하려는 프로젝트에 새 프로젝트 속성 시트 추가를 선택한다.
속성 시트를 선택하고 버전을 포함한 정보를 사용하여 이름을 정한다.
Debug, Release에 대해 모두 속성 시트를 만든다.
속성 파일을 사용할 때는 프로젝트의 속성의 같은 속성에 부모 또는 프로젝트 기본값에서 상속을 체크하여 상속된 값에 원하는 속성이 있는지 확인해야 한다.
이렇게 추가한 속성은 저장한 뒤 이후 같은 속성을 사용하는 다른 프로젝트에서 불러와서 사용할 수 있다.
2.
헤더 파일 디렉터리 추가
생성한 속성 시트를 더블 클릭 → C/C++ → 일반 → 추가 포함 디렉터리에 아래의 2가지 LibTorch의 헤더파일 경로 추가
$(LIBTORCH_DIR_DEBUG)\include 또는 $(LIBTORCH_DIR_RELEASE)\include
$(LIBTORCH_DIR_DEBUG)\include\torch\csrc\api\include 또는 $(LIBTORCH_DIR_RELEASE)\include\torch\csrc\api\include
3.
라이브러리 파일 디렉터리 추가
생성한 속성 시트를 더블 클릭 → 링커 → 일반 → 추가 라이브러리 디렉터리에 LibTorch의 라이브러리 경로 추가
$(LIBTORCH_DIR_DEBUG)\lib 또는 $(LIBTORCH_DIR_RELEASE)\lib
4.
라이브러리 파일 추가
생성한 속성 시트를 더블 클릭 → 링커 → 입력 → 추가 종속성에 <installpath>\lib 경로에 있는 아래의 lib 파일들 추가
caffe2_nvrtc.lib, c10.lib, c10_cuda.lib, torch.lib, torch_cpu.lib, torch_cuda.lib, torch_cuda_cpp.lib, torch_cuda_cu.lib
5.
명령줄 추가 옵션 입력
Visual Studio에서 프로젝트 우클릭 → 속성 → 링커 → 명령줄에 아래의 옵션 2개 입력 —이것은 PyTorch의 C++ 버전 자체에 존재하는 버그 때문에 해야 하는 것이다.
-INCLUDE:?warp_size@cuda@at@@YAHXZ
-INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
아래와 이미지와 같이 torch/torch.h 를 include 하고, 예제 코드 빌드 후 torch::cuda::is_available: 1이 뜨면 성공 —CUDA를 못 잡으면 0이 뜬다.

추가) LibTorch와 C++ 17

기본적으로 LibTorch를 세팅한 후 C++은 17 버전을 사용하려고 하면 아래와 같은 에러가 발생한다.
이는 CUDA가 11.x 버전은 C++ 17 버전을 지원하지만 10.x 버전은 C++ 14 버전을 사용하기 때문에 일어나는 일이다. 다행히 LibTorch 내부적으로는 C++ 17 버전을 지원하기 때문에, CUDA 11.x 버전을 사용하고 있다면 C++ 17 버전을 사용할 수 있다.
C++14 보다는 C++ 17 버전이 여러모로 편리한 것이 많기 때문에, 다음과 같이 설정해서 C++ 17 버전을 사용하자.
Visual Studio에서 속성 → C/C++ → 고급 → 특정 경고 사용 안 함에 4966을 입력 —4996은 위에 보이는 에러의 코드
이것은 부모로부터 상속이 되지 않으므로 속성 파일을 사용할 수 없다. 프로젝트 속성에 직접 추가해야 함

참조 자료