라즈베리 파이는 기본적으로 PyTorch의 GPU 가속을 사용할 수 없다. 라즈베리 파이 5의 경우 NPU 가속의 사용 가능성이 있지만, PyTorch에서는 이를 공식적으로 지원하지 않는다. 때문에 경량화 PyTorch를 사용해야 하는데, CPU만으로 동작하기 때문에 라즈베리 파이에서 직접 모델을 학습시키는 것은 매우 느리다.
따라서 모델은 PC에서 GPU 가속으로 학습하고, 이를 .onnx 형식으로 변환해 라즈베리 파이에 업로드한다. 그리고 C++에 포팅하여 데이터 전처리를 하는 방법을 사용한다.
이를 위해서 라즈베리 파이에 ONNX Runtime을 설치해야 한다. 일반적으로는 다음 과정을 거친다.
sudo apt update && sudo apt upgrade -y
sudo apt update
sudo apt install -y onnxruntime-dev # 라즈베리파이에서 불가능
onnxruntime은 Python용, onnxruntime-dev는 C++용이다. 필자는 C++을 사용하기 때문에 onnxruntime-dev로 설치한다.
하지만 라즈베리 파이의 공식 Debian 레포지토리에는 onnxruntime-dev가 포함되어 있지 않다. 따라서 라즈베리 파이에서 위 명령어를 입력하면 다음과 같은 에러가 발생한다.
따라서 라즈베리 파이에서 C++ API를 포함한 ONNX Runtime을 사용하려면 Microsoft에서 제공하는 ONNX Runtime의 C++ 라이브러리를 다운로드하여 직접 설치하거나, 소스코드를 직접 빌드해야 한다. 여기서는 라즈베리 파이 환경에 최적화시키기 위해 소스코드를 직접 빌드하도록 한다.
sudo apt update
sudo apt install -y cmake build-essential protobuf-compiler libprotobuf-dev
빌드에 필요한 패키지를 설치한다.
git clone --recursive https://github.com/microsoft/onnxruntime
cd onnxruntime
ONNX Runtime 소스 코드를 다운로드한다.
./build.sh --config Release --build_shared_lib
빌드 스크립트를 실행한다. 이때 CMake 버전이 3.28 이상이어야 한다.
최신 cmake 설치 방법
sudo apt remove --purge cmake
기존 CMake 제거
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-aarch64.sh
CMake 최신 버전 다운로드
chmod +x cmake-3.28.3-linux-aarch64.sh
sudo ./cmake-3.28.3-linux-aarch64.sh --prefix=/usr/local --skip-license
설치 권한 부여 및 실행
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
환경변수 추가
cmake --version
버전 확인 결과 cmake version 3.28.3 로 출력되면 정상적으로 설치된 것이다.
CMake 버전 확인 후 다시 빌드 스크립트를 실행한다.
./build.sh --config Release --build_shared_lib
빌드에는 2시간 가량 걸린다.
빌드가 완료되면 다음과 같이 실행이 가능한지 확인해본다.
ls -l ~/onnxruntime/build/Linux/Release/libonnxruntime.so
-rwxr-xr-x 1 zerogod zerogod 12345678 Feb 6 20:45 /home/zerogod/onnxruntime/build/Linux/Release/libonnxruntime.so
위와 같이 출력되면 정상적으로 설치된 것이다.
다음으로 빌드 디렉터리로 이동해 설치를 진행한다.
find /home/zerogod/onnxruntime -name onnxruntimeConfig.cmake
실행 결과 다음과 같이 빌드 디렉터리에 파일이 존재함을 찾을 수 있다.
zerogod@raspberrypi:~/project_mnist/build $ find /home/zerogod/onnxruntime -name onnxruntimeConfig.cmake
/home/zerogod/onnxruntime/build/Linux/Release/onnxruntimeConfig.cmake
해당 디렉터리로 이동하여 install한다.
zerogod@raspberrypi:~/project_mnist/build $ cd /home/zerogod/onnxruntime/build/Linux/Release
zerogod@raspberrypi:~/onnxruntime/build/Linux/Release $ sudo make install
이 상태로 install하면 다음과 같은 에러를 만나게 될 수도 있다.
[ 97%] Built target absl_random_internal_pool_urbg
[ 97%] Built target absl_random_seed_sequences
[ 98%] Built target absl_random_internal_distribution_test_util
[100%] Built target absl_status
[100%] Built target absl_statusor
[100%] Built target absl_cordz_sample_token
Install the project...
-- Install configuration: "Release"
CMake Error at cmake_install.cmake:47 (include):
include could not find requested file:
/home/zerogod/onnxruntime/build/Linux/Release/_deps/abseil_cpp-build/cmake_install.cmake
make: *** [Makefile:110: install] Error 1
이 경우 cmake_install.cmake 파일을 열어 47번 째 줄을 다음과 같이 수정해준다.
zerogod@raspberrypi:~/onnxruntime/build/Linux/Release $ nano /home/zerogod/onnxruntime/build/Linux/Release/cmake_install.cmake
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
# Include the install script for the subdirectory.
include("/home/zerogod/onnxruntime/build/Linux/Release/_deps/abseil_cpp-build/cmake_install.cmake")
endif()
위 코드를 다음과 같이 수정
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
if(EXISTS "/home/zerogod/onnxruntime/build/Linux/Release/_deps/abseil_cpp-build/cmake_install.cmake")
include("/home/zerogod/onnxruntime/build/Linux/Release/_deps/abseil_cpp-build/cmake_install.cmake")
else()
message(WARNING "Warning: _deps/abseil_cpp-build/cmake_install.cmake not found. Skipping abseil installation step.")
endif()
endif()
onnxruntime 라이브러리를 사용하기 위한 CMakeLists.txt를 작성한다. 우선 다음과 같이 경로를 확인한다.
zerogod@raspberrypi:~/onnxruntime/build/Linux/Release $ find /usr/local -name onnxruntimeConfig.cmake
/usr/local/lib/cmake/onnxruntime/onnxruntimeConfig.cmake
onnxruntime 경로
zerogod@raspberrypi:~/onnxruntime/build/Linux/Release $ find /usr/local/include -name "onnxruntime_c_api.h"
/usr/local/include/onnxruntime/onnxruntime_c_api.h
onnxruntime 헤더파일 경로
확인한 경로를 바탕으로 CMakeLists.txt를 작성한다.
cmake_minimum_required(VERSION 3.15)
# 프로젝트 이름
project(project_MNIST)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
# 설치된 onnxruntime 경로 지정
set(onnxruntime_DIR "/usr/local/lib/cmake/onnxruntime")
# OpenCV 및 ONNX Runtime 찾기
find_package(OpenCV REQUIRED)
find_package(onnxruntime REQUIRED)
# 헤더 파일 경로 추가
include_directories(${CMAKE_SOURCE_DIR}/src/include)
include_directories(/usr/local/include) # 설치된 헤더 경로
# 소스 파일 지정
file(GLOB SOURCES "src/cpp/*.cpp")
# 실행 파일 생성
add_executable(main ${SOURCES})
target_link_libraries(main ${OpenCV_LIBS} onnxruntime)
'Linux' 카테고리의 다른 글
[VMware][OpenCV] Ubuntu 카메라 사용 설정 (1) | 2025.02.05 |
---|---|
[VMware][OpenCV] Ubuntu SSH 연결 시 GUI 사용 설정 (0) | 2025.02.05 |
[PyTorch] WSL에서 CUDA, cuDNN, PyTorch 설치 및 사용 (0) | 2025.01.27 |
[OpenCV] Linux 환경에서 OpenCV 설치 및 사용 (0) | 2025.01.27 |
[Linux] Linux Terminal on Window - WSL (0) | 2025.01.12 |