이전 글
시작하기
앞선 글의 이유 때문에, PyTorch를 직접 빌드해서 Unreal Engine(이하 UE)에 붙여야 겠다고 마음먹었고, 다양한 시행착오를 겪으며, 빌드 하였다. 헤맬때는 힘들었는데, 알고나니 허무한 점이 참 많다.
LibTorch를 빌드하는 방법이 체계적으로 잘 설명되어 있지 않다. 공식 문서는 아래 주소에 있다.
https://github.com/pytorch/pytorch/blob/master/docs/libtorch.rst
다른 사람이 쓴 글은 여기 있다.
문서가 있으니까 쉽게 될 것 같지만, 안!된!다!
이 PyTorch가 플랫폼, 언어, Cuda지원 등 여러 옵션이 있어서, 관련 빌드 옵션이 굉장히 많고, 빌드를 위해서 설치해두어야 할 것도 여럿 있다. 원하는 빌드 옵션과 각 컴 환경이 달라서, 모든 경우를 다 설명할 수는 없고, 내가 진행한 방법만들 설명하겠다.
자세히 모든 스텝을 설명하지는 않는다. (설명하기 너무 힘듦). 중요한 포인트를 대략적으로 나마 모두 설명했으니, 참고할만 할 거나고 생각한다.
PyTorche 소스코드 다운로드
먼저 PyTorch source code 를 github 페이지에서 clone한다.
https://github.com/pytorch/pytorch
이때 download zip파일 하지 말고, 반드시 git clone으로 받아야 한다. download zip으로 받으면, 아래와 같은 문제가 생긴다.
- PyTorch는 많은 third-party 코드들을 사용하는데, download zip으로 받으면, 이들은 다운로드 되지 않는다. 이 것들은 수동으로 하나씩 download를 또해줘야 한다. 게다가 이들 third-party들이 내부적으로 또 다른 third party를 사용하고, 그것들이 또 third party를 쓰고를 반복한다. 그냥 git clone으로 하면 이들을 다 다운로드 하니 맘 편하다. 뭐 PyTorch를 빌드하겠다고 마음 먹은 사람이 git에 익숙하지 않을리는 없을테니, 속 편하게 git clone하자.
- 1번 문제를 수동으로 다 해결했다 하더라도, 나중에 cmake generate 단계에서 실패한다. 얘가 (쓸데없이) .git 폴더를 확인하기 때문이다. 뭐 이 확인하는 코드를 찾아서 없애면 되긴 하는데, 그냥 속편하게 git clone하자.
나는 처음에 clone이 귀찮아서, 그냥 download zip했다가 위 시행착오를 다 겪었다. 여러분은 그럴 필요가 없다.
Python 환경 만들기
그 다음에 공식 문서나 다른 글은 tools/setup.py 와 tools/build_libtorch.py를 실행하라고 되어 있는데, 해보면 잘 안 된다. 심지어는 공식문서에도 “네 필요에 맞게 네가 알아서 고쳐야 할거야” 라고 나와있다. (친절한 건지, 불친절한 건지.) 좀 더 편하게 bat 파일도 있다. scipts/build_windows.bat이 있는데, 이걸 실행해도 역시 동일한 에러 메시지를 잔뜩 볼 수 있다. build_windows.bat 내부를 보면 단순히 build_libtorch.py를 실행하는 것 뿐이다. 따라서 python이 설치가 되어 있지 않거나, path설정이 안 되어 있으면, python.exe 를 찾을 수 없다는 에러 메세지 부터 나온다.
빌드용 파일들을 만들 때 부터, python을 사용하기 때문에, python 실행 환경을 만들어야 한다. python을 다운로드 받고, 필요한 환경을 구축하는 것은 다른 문서를 참고해서 진행하자.
나의 경우에는 PyCharm을 사용하였다. Conda를 많이들 사용하는데, 내 경우에는 jetbrain 제품을 좋아해서 PyCharm을 Python IDE로 사용하였다. 각자 선택한 python 환경을 구축하여 python이 실행가능한 환경을 만들어 놓자. 이 후의 설명은 PyCharm 사용을 기반으로 진행한다.
PyCharm도 그냥 바로 되는게 아니고, interpreter 및 venv설정하고, 내 경우에는 좀 더 편하게 쓰려고 terminal 옵션도 좀 수정했다.

그리고 프로젝트로 다운로드된 pytorch 폴더를 선택해서 열고, build_libtorch.py를 실행하면 역시 동일한 에러 메세지가 나온다. 이때 python interpreter가 설정되어 있지 않으면, 이것 부터 해결해 줘야 한다. 또 당연하지만, VS와 cmake이 설치되어 있어야 한다. 나는 VS2019를 사용했다.
Python 빌드 코드 수정
build_libtorch.py를 실행하면 나오는 에러 메세지를 하나씩 해결해 줘야 하는데, 에러 메세지는 대개 두 종류다.
- 환경변수 설정 부족
- 필요한 모듈 설치 안 됨
환경변수는 파일탐색기나 command로 설정해도 되지만, 편리하게 관리하기 위해, build_libtorch.py를 수정하여 code로 작성했다.

설정가능한 환경변수는 위 코드에 적은 것 말고도 매우 많다. 내경우에는 static-link library로 빌드하고 (BUILD_SHARED_LIBS=OFF), cuda를 연동하지 않는 걸로 했다 (USE_CUDA=OFF). cuda 연동 빌드도 가능하겠지만, 당장은 빌드 복잡도를 줄이기 위해 cuda를 껐다.
Python 추가 모듈 설치
또 다른 에러는 모듈이 없다는 것인데, 이런 모듈은 수동으로 추가해서 해결하였다. 각자 상황에 따라 다르지만 나는 typing-extensions와 yaml이라는 모듈이 없다라고 나와서 terminal 창에서 pip로 추가했다.

OpenMP 관련 Cmake 수정
마지막 문제는 힘들었는데, OpenMp 요구사항이었다. PyTorch의 cmake 설정의 버그였는지, 이게 없다고 에러메세지를 내놓는데, 이건 python 모듈이 아니고, VS를 설치한 순간에 이미 설치된 것인데, 자꾸 이 부분에서 문제가 생겼다. 결국 이건 OpenMP를 설치하는게 아니라, cmake 코드를 수정하여 해결하였다.

그리고 다시 실행하니 드디어 cmake generate 정상 동작했다.
VS 프로젝트 설정
앞서 단계에서 generate가 완료되면, 자동으로 이어서 cmake build가 실행되는데, 이 부분은 중지하고, 직접 VS에서 빌드를 시도했다. VS가 훨씬 익숙할 뿐더러 문제가 생기면 찾고, 해결하기가 훨씬 용이해서다. pytorch의 build 폴더에 가보면 sln, vcproj와 각종 소스코드들 그리고 cmake 파일들이 이쁘게 생성되어 있는 것을 볼 수 있다.

참고로 여기서 생성된 build 폴더를 다른 폴더 위치로 옮겨서 빌드하면 안 된다. 내부 cmake 설정 파일에 절대 경로가 들어가 있어서, 빌드 실패하게 된다. 반드시 파일이 만들어진 그 폴더 그대로 사용해야 한다. (사소한 문제이지만, 나는 폴더를 옮겨봤고 그래서 빌드 실패하고 원인을 찾아 헤맸다. 여러분은 나와 같은 시행착오를 할 필요가 없다.)
sln 파일을 열면 아래와 같이 180개가 넘는 프로젝트 목록을 볼 수 있다.

이 중에서 onnx 폴더의 프로젝트 설정창을 열어서 혹시 아래와 같이 되어 있는지 확인해보자.

이 상태에서도 LibTorch 빌드 자체는 문제가 없는데, UE에 링크를 하면, 링크 에러가 발생한다. 반드시 Runtime Library를 Multi-threaded DLL로 바꿔준다.

onnx 프로젝트 말고도, UE 링크시에 아래와 같은 에러가 발생한다면, 해당 프로젝트의 설정을 위처럼 바꿔서 다시 빌드해서 사용하자.
LINK2038: mismatch detected for 'RuntimeLibrary' : value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' ...

소스코드 빌드
ALL_Build 프로젝트를 빌드하면 전체 프로젝트가 다 빌드 된다. 플랫폼은 x64만 있기 때문에 이것을 선택하고, configuration을 RelWithDebInfo을 선택하기를 추천한다. Debug 빌드는 lib 파일이 너무 커져서, 파일 사이즈 오버로 link 실패하고, release 빌드는 pdb 파일을 안 만들기 때문에, pytorch 내부의 디버깅이 되지 않는다. 차후에 연동이 다 잘 되어서 굳이 pytorch 디버깅이 필요하지 않으면, release 빌드를 사용해도 된다.
빌드 실행하면, 꽤 오랜 시간동안 CPU 사용과 IO가 확 늘어나면서 빌드가 진행된다. 사실 이 글도 빌드되는 동안 정리하는 겸 (이라기 보다는 할 일이 없어져서) 쓰는 중이다. (CPU 100%먹을때, 버벅거리는 마우스 커서와 싸우며 글을 썼다.) 빌드가 끝나면 아래와 같은 결과가 나오는데, 105개 프로젝트는 빌드 성공했고, 70개는 실패했다.

에러 내용을 보면 전부 link error다.

한 symbol이 여러 곳에서 선언이 되어 있어서 그런데, 아마 이건 static library 빌드였기 때문에 그런 것 같다. dynamic libarary 로 빌드했으면, 아마 다른 에러메세지가 나왔을 것이다.
다행히 이 link 에러는 신경쓰지 않아도 된다. 모든 플젝을 다 빌드할 필요없이, 필요한 static libarary project만 빌드 성공하면 된다. pytorch/build/lib 폴더에 가면, 빌드에 성공한 static library들이 보인다.

여기까지 오는 것도 쉽지는 않을 것이다. 여기까지 완료가 되면, 이제 반절은 한 거다.










