[LibTorch] M2 Mac에서 LibTorch 사용하기

Namkoong Hugh·2023년 4월 1일
0

빠른 요약 - 공홈에서 다운받지 말고 직접 빌드하자

Pytorch 공식 홈페이지에서 제공하는 LibTorch 라이브러리 2.0.0 버전을 다운받아 LibTorch를 사용하고자 시도하였다.

https://pytorch.org/get-started/locally/

다운받은 zip 압축파일을 풀고 나온 libtorch 폴더를 적당한 곳에 위치시키자.

그리고 파이토치 공식 홈페이지에서 다운받은 LibTorch 라이브러리를 사용하여 파이토치 공식 문서가 설명하는대로 바이너리 파일을 빌드하고자 하면 무슨 일이 일어날까?

아래 코드는 전부 파이토치 공식 문서에 있는 것들을 수정한 것이다.
https://pytorch.org/cppdocs/installing.html

CMAKE 파일 구성

# CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app src/main.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

# The following code block is suggested to be used on Windows.
# According to https://github.com/pytorch/pytorch/issues/25457,
# the DLLs need to be copied to avoid memory errors.
# mac 유저는 이 부분은 신경쓰지 않아도 된다
if (MSVC)
  file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
  add_custom_command(TARGET example-app
                     POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
                     ${TORCH_DLLS}
                     $<TARGET_FILE_DIR:example-app>)
endif (MSVC)

C++ 코드

// src/main.cpp
#include <torch/torch.h>
#include <iostream>

int main() {
// MPS Backend
  torch::Tensor tensor = torch::rand({2, 3},torch::TensorOptions().device(torch::kMPS));
  std::cout << tensor << std::endl;
}

프로젝트 폴더 구성

- libtorch-example
  ⌞ CMakeLists.txt
  ⌞ src
     ⌞ main.cpp

터미널 명령어

libtorch-example 디렉토리에서 터미널로 다음 명령어를 입력하면..

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/당신이/다운받은/라이브러리/폴더를/둔/절대경로/libtorch ..
cmake --build . --config Release

결과?

빌드에 실패한다

왜냐하면 파이토치 공식 설치 페이지 에서 다운받은 놈은 x86-64로 빌드된 라이브러리이기 때문이다. arm64 빌드는 따로 제공하지 않는다. 굳이 맥북으로 파이토치를 쓰는 인간도 많이 없을텐데, 거기서 또 굳이 굳이 굳이 LibTorch를 쓰는 인간이 얼마나 적은지 새삼 알 수 있는 지표가 아닐까?

해결 방법

라이브러리를 직접 빌드하자.
pytorch github 레포지토리의 다음 문서를 참고해서 자신의 Apple Silicon 기기에서 직접 빌드하면 된다.
https://github.com/pytorch/pytorch/blob/master/docs/libtorch.rst

git clone -b v2.0.0 --recurse-submodule https://github.com/pytorch/pytorch.git
mkdir pytorch-build
cd pytorch-build
cmake -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=Release -DPYTHON_EXECUTABLE:PATH=`which python3` -DCMAKE_INSTALL_PREFIX:PATH=../pytorch-install ../pytorch
cmake --build . --parallel 4 --target install

-b (--branch) option에 원하는 배포 버전 태그명을 넣자.
cmake --build--parallel option은 기기 코어수를 고려하여 적당히 설정하자.

빌드가 완료되면 pytorch-install 폴더가 생성될 것이다.
CMAKE_PREFIX_PATHpytorch-install 로 바꾼 위 명령어를 다시 실행해보자.

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/빌드로/생성된/pytorch-install ..
cmake --build . --config Release

CMAKE_PREFIX_PATH 에 절대 경로를 집어넣는것을 유의하자.

빌드된 결과물을 실행해보면

일단 실행은 된다.

  • pytorch 깃허브 레포 이슈를 보면 libtorch에서는 2.0에서 간간히 버그가 있나보다.
    일단 ResNet LibTorch 구현체 정도는 MPS 백엔드에서 학습이 되는걸 확인했다.
  • 2.0이 공식 공개되기 이전에 pytorch mps 백엔드로 구글 서칭해보면 아직 불안정하다는 평이 많았는데, 일단 (ResNet 정도에 들어가는) 흔한 연산들은 나름 정상적으로 지원하는 것 같다. CUDA에는 못 미치더라도 나름 간단하게 로컬에서 테스트용으로 학습 돌릴 정도는 쓸 수 있을 것 같기도?
    • 물론 실제 학습은 libtorch가 아니라 파이썬으로 할 것이다.

0개의 댓글