카테고리 보관물: Linux

OpenVINO로 Intel NPU에서 추론 실행하기

Intel 14세대 Meteor Lake 부터 NPU가 함께 embedding되어 제공된다. Linux system에서 사용하려면 kernel version 6.2이상이 설치되어 있어야 한다.

NPU 디바이스 확인

CPU: Intel(R) Core(TM) Ultra 5
OS: Ubuntu 24.04
Linux kernel: 6.14.0-33-generic

lspci 명령어로 NPU 디바이스가 인식되어 있는지를 확인할 수 있다.

$ lspci -v|grep -A 9 NPU
00:0b.0 Processing accelerators: Intel Corporation Arrow Lake NPU (rev 01)
        DeviceName: Onboard - Other
        Subsystem: Gigabyte Technology Co., Ltd Device 7270
        Flags: bus master, fast devsel, latency 0, IRQ 154, IOMMU group 6
        Memory at 6408000000 (64-bit, non-prefetchable) [size=128M]
        Memory at 6410065000 (64-bit, non-prefetchable) [size=4K]
        Capabilities: <access denied>
        Kernel driver in use: intel_vpu
        Kernel modules: intel_vpu

커널에서 잘 인식 되었다면 아래의 경로에 디바이스 노드가 보이게 된다.

$ ls -l /dev/accel/accel0 
crw-rw---- 1 root render 261, 0 Oct 10 19:27 /dev/accel/accel0

Linux용 NPU driver 설치

이제 NPU를 Linux에서 사용하기 위한 드라이버를 설치해야 한다. 관련한 내용은 Intel GitHub의 Linux NPU driver release 문서에 자세히 설명되어 있다.

GitHub의 release page를 찾아가서 압축파일을 다운로드 받아 dpkg로 설치하면 모든 준비가 완료된다.

wget https://github.com/intel/linux-npu-driver/releases/download/v1.24.0/linux-npu-driver-v1.24.0.20251003-18218973328-ubuntu2404.tar.gz
tar -xf linux-npu-driver-v1.24.0.20251003-18218973328-ubuntu2404.tar.gz

sudo apt update
sudo apt install libtbb12

sudo dpkg -i *.deb

# Level zero가 설치되지 않은경우에만
wget https://github.com/oneapi-src/level-zero/releases/download/v1.24.2/level-zero_1.24.2+u24.04_amd64.deb
sudo dpkg -i level-zero*.deb

OpenVINO device 목록 확인

OpenVINO의 Core() class안에 있는 available_devices 멤버 변수를 출력하면 사용가능 한 추론 장치의 목록이 표시되는데 아래와 같이 CPU, GPU와 함께 NPU가 표시되는 것을 볼 수 있다.

python3 -m venv .venv
source .venv/bin/activate
(.venv) pip install setuptools
(.venv) pip install openvino openvino-dev
(.venv)$ python3 -c "from openvino import Core; print(Core().available_devices)"
['CPU', 'GPU', 'NPU']

성능측정 결과

Ultralytics의 문서를 따라 YOLOV11n을 OpenVINO용으로 변환해서 OpenVINO benchmark_app으로 측정하였다.

NPU 벤치마크 결과는 다음과 같다. CPU보다 다소 좋은 성능을 보이고, 실행하는 동안 CPU utilization이 증가되지 않는 것이 확인된다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d NPU
...
[ INFO ] Execution Devices:['NPU']
[ INFO ] Count:            9704 iterations
[ INFO ] Duration:         60033.42 ms
[ INFO ] Latency:
[ INFO ]    Median:        24.50 ms
[ INFO ]    Average:       24.52 ms
[ INFO ]    Min:           23.54 ms
[ INFO ]    Max:           69.62 ms
[ INFO ] Throughput:   161.64 FPS

CPU로 수행한 결과는 다음과 같다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d CPU
...
[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:            6351 iterations
[ INFO ] Duration:         60047.25 ms
[ INFO ] Latency:
[ INFO ]    Median:        24.51 ms
[ INFO ]    Average:       28.31 ms
[ INFO ]    Min:           23.05 ms
[ INFO ]    Max:           45.46 ms
[ INFO ] Throughput:   105.77 FPS

iGPU로 실행했을 때 throuput은 가장 좋으나 Max latency가 높은 것이 관찰되는데 아마도 로딩을 위한 메모리 복사 소요 시간으로 추정된다.

$ benchmark_app -m ./yolo11n_openvino_model/yolo11n.xml -d GPU
...
[ INFO ] Execution Devices:['GPU.0']
[ INFO ] Count:            87056 iterations
[ INFO ] Duration:         60013.22 ms
[ INFO ] Latency:
[ INFO ]    Median:        10.77 ms
[ INFO ]    Average:       10.83 ms
[ INFO ]    Min:           4.51 ms
[ INFO ]    Max:           1010.93 ms
[ INFO ] Throughput:   1450.61 FPS

외부에서 private망에 물린 host로 접속하기 – SSH Jump Host

사무실에 있는 내 workstation에는 두개의 LAN이 연결되어 있고 각각 public network와 private network에 연결되어있다. 외부에서 private network에 연결되어 있는 target host에 SSH로 연결 할 때는 먼저 workstation에 ssh로 연결하고, 여기에서 private망에 물려있는 target host로 또 다시 ssh를 연결해야 한다.

하지만 ssh의 -J option을 이용하면 workstation을 jump host로 이용해서 이런 귀찮은 여러번 접속을 피할 수 있다. 다음은 ssh의 -J 옵션에 대한 설명을 man-page에서 발췌해서 의역한 것이다.

-J 목적지
    Jump host에 ssh 연결을 생성한 다음 최종 목적지 호스트로 TCP 포워딩을 설정하여
    연결을 생성합니다. 여러개의 jump host를 명시하려면 콤마를 사용해서 지정해 줄 수
    있습니다. 이 옵션은 ProxyJump 환경설정 예약어에 대한 단축설정 입니다. 
    주의: 일반적으로 명령줄에 작성하는 옵션들은 최종 목적지 호스트에 적용되며 jump host
    들에는 적용되지 않습니다. Jump host에 옵션을 설정하려면 ~/.ssh/config file을
    활용 하세요.

예를 들어 workstation의 public IP가 203.0.113.5, private network에 있는 target의 IP가 192.168.100.5라 할 때 다음과 같이 203.0.113.5를 jump host로 설정해서 한 번에 접속할 수 있다.

ssh -J user@203.0.113.5 user@192.168.100.5

이러한 설정을 .ssh/config에 jump host를 명시해서 설정해 두면 workstation을 jump host로해서 target에 접속할 수 있고 무엇보다도 visual studio code에서도 곧바로 접속할 수 있다는 점이 편하다. 아래의 설정에서 ProxyJump 설정하는 부분을 눈여겨 보자.

Host workstation
  HostName 203.0.113.5
  User user

Host target
  HostName 192.168.100.5
  User user
  ProxyJump workstation

설정 후에는 private IP인 target으로 곧바로 접속 할 수 있다.

ssh target

Orange3 Text Add-On 추가할 때 빌드오류

Orange3에 Text Add-on을 추가하는 도중 SciPy를 빌드하려 시도하는데 오류가 발생한다. Fortran을 비롯한 의존성이 만족되지 않아서 발생하는 문제인데 여러건의 빌드 오류를 피하려면 SciPy의 Building from Source를 참고해서 필요한 패키지를 미리 설치해 줄 수 있다. ArchLinux의 경우 필요한 패키지는 다음과 같다.

sudo pacman -S gcc-fortran openblas pkgconf base-devel python-setuptools

그리고 나서 필요한 Python package를 설치해주고 재실행한다.

pip install Cython Orange3-text

의존성있는 패키지 중 하나인 gensim은 최신 버전인 4.3.3과 Python3.13의 호환성 문제로 2025년 10월 현재 Python3.13에서 빌드되지 않는다. 그래서 yay로 3.12를 설치하고 가상환경을 새로 만들어서 설치를 진행해 주었다.

OS: ArchLinux
Python: 3.12
PyQt5: 5.15.11
PyQtWebEngine: 5.15.7
scipy: 1.13.1
gensim: 4.3.3
Orange3: 3.39
Orange3-Text: 1.16.3

그나저나 “Fortran이라니, 되게 오래된 코드에 의존성이 있는 건가?”하고 살펴봤더니 은퇴는 커녕 OOP까지 지원하면서 Modern Fortran이라는 이름으로 고성능컴퓨팅(HPC)에서는 짱짱한 현역으로 뛰고 있었다. Workgroup의 활동을 보면 2020년대에 2023에 이은 두번째 표준안을 준비하고 있는 모양이다.