
FastFlowLM을 사용하여 AMD NPU에서 LLM 실행하기 - Fedora 가이드
요약
Fedora 환경에서 AMD NPU를 활용해 LLM을 실행하기 위한 FastFlowLM 설정 가이드를 제공합니다. 커널 드라이버, XRT, NPU 플러그인, FastFlowLM을 소스에서 직접 빌드하는 과정을 다룹니다.
핵심 포인트
- AMD NPU 사용 시 커널 명령줄에서 amd_iommu=off 설정을 반드시 제거해야 함
- Fedora에서는 XRT와 NPU 플러그인을 소스에서 직접 빌드해야 함
- Strix Halo 등 최신 XDNA2 NPU 아키텍처 지원
- amdxdna DKMS 드라이버와 커널 요구 사항 확인 필요
FastFlowLM을 사용하여 AMD NPU에서 LLM 실행하기 - Fedora 가이드
Fedora 44, 커널 7.0.12, ROG Flow Z13 (Ryzen AI Max 390 / Strix Halo NPU)에서 테스트되었습니다.
목표: Fedora에서
flm validate및flm run이 작동하도록 하는 복사-붙여넣기 가능한 설정법.
요약 (TL;DR)
**네 가지 레이어 (layers)**가 함께 작동해야 합니다:
| 레이어 | 역할 |
|---|---|
Kernel + DKMS 드라이버 (amdxdna) | /dev/accel/accel0 생성, NPU 펌웨어 로드 |
| ... |
Fedora에는 Ubuntu와 같은 사전 빌드된 PPA가 없습니다. XRT, NPU 플러그인 (NPU plugin), 그리고 FastFlowLM을 소스에서 직접 빌드해야 합니다.
우리가 맞닥뜨린 두 가지 명확하지 않은 차단 요소:
- 커널 명령줄(cmdline)의
amd_iommu=off— GPU LLM 튜닝 시 흔히 사용되지만, NPU를 망가뜨립니다 xrt-smi심볼릭 링크 (Symlinking) — 스크립트가 경로에 민감하므로, 대신 래퍼 (wrapper)를 사용하세요
테스트된 하드웨어
| 항목 | 값 |
|---|---|
| 기기 | ASUS ROG Flow Z13 GZ302EA |
| ... |
동일한 스택을 사용하여 다른 XDNA2 NPU (Strix, Strix Halo, Kraken, Gorgon Point)에서도 작동합니다.
시작하기 전에
커널 요구 사항
- Linux 7.0+ (Fedora 44 탑재) 및 인트리 (in-tree)
amdxdna지원 - Strix Halo (rev 11)의 경우, 기본 인트리 모듈보다
xdna-driver에서 제공하는 아웃오브트리 (out-of-tree) DKMS 드라이버를 권장합니다. - IOMMU가 반드시 활성화되어야 합니다 — IOMMU 섹션을 참조하세요
현재 커널 명령줄 확인하기
cat /proc/cmdline
만약 amd_iommu=off가 보인다면, 드라이버 빌드에 시간을 낭비하기 전에 이를 제거하세요. 자세한 내용은 아래에 있습니다.
1. 빌드 의존성 설치
sudo dnf install -y \
git jq dkms \
kernel-devel-$(uname -r) kernel-headers \
...
AMD의 의존성 스크립트를 실행하세요 (선택 사항이지만 도움이 됩니다):
git clone --recursive https://github.com/amd/xdna-driver.git ~/repos/xdna-driver
cd ~/repos/xdna-driver
sudo ./tools/amdxdna_deps.sh
...
Fedora OpenCL 참고 사항: Fedora 44는 이전의
ocl-icd패키지가 아닌OpenCL-ICD-Loader를 사용합니다. 만약 XRT 빌드가 OpenCL ICD 레이아웃 또는 RPM 의존성 문제로 실패한다면, Fedora XRT 빌드 수정 사항(Fedora XRT build fixes)을 참조하세요.
cmake3 래퍼 (Fedora는 CMake 4.x를 cmake로 제공함)
XRT 빌드 스크립트는 Fedora에서 cmake3를 찾습니다. 시스템 심볼릭 링크(symlink)를 만들 필요 없이 로컬 래퍼(wrapper)를 생성하세요:
mkdir -p ~/.local/xrt-build/bin
ln -sf /usr/bin/cmake ~/.local/xrt-build/bin/cmake3
echo 'export PATH="$HOME/.local/xrt-build/bin:$PATH"' >> ~/.bashrc
...
2. XRT 빌드 및 설치
cd ~/repos/xdna-driver/xrt/build
./build.sh -npu -opt -disable-werror -noinit -j $(nproc)
RPM을 설치합니다 (버전 문자열은 약간 다를 수 있습니다):
cd ~/repos/xdna-driver/xrt/build/Release
sudo dnf install -y xrt-base-*.rpm xrt-base-devel-*.rpm xrt-npu-*.rpm
XRT 라이브러리를 시스템 전체에 등록
이 과정을 거치지 않으면, flm 실행 시 libxrt_coreutil.so.2: cannot open shared object file 오류가 발생하며 실패합니다:
echo '/opt/xilinx/xrt/lib64' | sudo tee /etc/ld.so.conf.d/xrt.conf
sudo ldconfig
확인:
ldconfig -p | grep xrt
3. NPU 플러그인 빌드 및 설치 (DKMS 드라이버 + XRT shim)
이 단계는 **libxrt_driver_xdna.so**를 제공하며, 인트리(in-tree) 커널 모듈을 DKMS 빌드로 교체합니다.
export PATH="$HOME/.local/xrt-build/bin:$PATH"
cd ~/repos/xdna-driver/build
./build.sh -release -j $(nproc)
플러그인 RPM을 설치합니다:
sudo dnf install ~/repos/xdna-driver/build/Release/xrt_plugin.*.rpm
DKMS 모듈이 활성화되었는지 확인합니다 (경로에 extra/ 또는 updates/dkms/가 포함되어야 하며, kernel/drivers/accel/이 아니어야 합니다):
modinfo -F filename amdxdna
# 예: /lib/modules/7.0.12-201.fc44.x86_64/extra/amdxdna.ko.xz
모듈이 방금 설치되었다면 재부팅하십시오:
sudo reboot
4. memlock 제한 수정
NPU는 잠긴 메모리(locked memory)가 필요합니다. 현재 제한을 확인하세요:
ulimit -l
만약 unlimited가 아니라면:
sudo tee /etc/security/limits.d/99-memlock.conf <<'EOF'
* soft memlock unlimited
* hard memlock unlimited
...
로그아웃 후 다시 로그인하거나(또는 재부팅), 다음을 통해 확인하세요:
ulimit -l
# unlimited
5. 중요: amd_iommu=off를 사용하지 마세요
amd_iommu란 무엇인가요?
IOMMU (AMD 플랫폼의 경우 AMD-Vi)는 PCIe 장치가 메모리에 접근하는 방식을 중재합니다. NPU 드라이버는 NPU가 프로세스의 가상 주소 공간 (Virtual Address Space)을 공유할 수 있도록 PASID / SVA (Shared Virtual Addressing, 공유 가상 주소 지정)를 사용하며, 이를 위해서는 IOMMU가 필요합니다.
amd_iommu=off는 IOMMU를 완전히 비활성화합니다. Strix Halo 사용자들은 llama.cpp에서 **5~12% 더 빠른 GPU 추론 (Inference)**을 위해 이 설정을 추가하곤 합니다. 하지만 이러한 트레이드오프(Trade-off)는 NPU 지원을 불가능하게 만듭니다.
IOMMU가 꺼져 있을 때의 증상
[ERROR] No NPU device found.
amdxdna_sva_init: SVA bind device failed, ret -19
PASID unavailable and carveout not configured
...
해결 방법
/etc/default/grub 파일을 편집하여 amd_iommu=off를 제거하세요:
sudo nano /etc/default/grub
변경 전:
GRUB_CMDLINE_LINUX="... amd_iommu=off amdgpu.gttsize=24576 ..."
변경 후 (GPU 튜닝 플래그는 유지하고, IOMMU 비활성화 옵션만 제거하세요):
GRUB_CMDLINE_LINUX="... amdgpu.gttsize=24576 ttm.pages_limit=6291456"
Grub을 재생성하고 재부팅하세요:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
재부팅 후:
cat /proc/cmdline | grep amd_iommu || echo "OK: amd_iommu not disabled"
선택적인 절충안: 일부 사용자들은 NPU를 작동시키면서 IOMMU 오버헤드를 약간 줄이기 위해
amd_iommu=off대신iommu=pt를 사용합니다. 주의: AMD에서는amd_iommu=pt는 유효하지 않습니다.amd_접두사 없이iommu=pt를 사용하세요.
6. FastFlowLM 빌드 및 설치
sudo dnf install -y \
libavformat-devel libavutil-devel libavcodec-devel \
libswresample-devel libswscale-devel
...
flm은 /opt/fastflowlm/bin/flm에 설치됩니다 (/usr/local/bin/flm에 심볼릭 링크(Symlink) 생성됨).
7. xrt-smi 사용 가능하게 만들기 (선택 사항이지만 유용함)
xrt-smi는 /opt/xilinx/xrt/bin/에 위치합니다. 환경 스크립트를 소싱(Source)할 수 있습니다:
source /opt/xilinx/xrt/setup.sh
xrt-smi를 /usr/local/bin에 심볼릭 링크(symlink)로 생성하지 마세요 — 래퍼 스크립트(wrapper script)가 dirname "$0"를 사용하기 때문에 심볼릭 링크로 연결되면 다음과 같이 오류가 발생하며 작동이 중단됩니다:
/usr/local/bin/xrt-smi: line 46: /usr/local/bin/unwrapped/xrt-smi: No such file or directory
대신, 다음과 같이 작은 래퍼(wrapper)를 만드세요:
sudo tee /usr/local/bin/xrt-smi <<'EOF'
#!/bin/sh
exec /opt/xilinx/xrt/bin/xrt-smi "$@"
...
또는 ~/.bashrc에 XRT를 PATH에 영구적으로 추가하세요:
export PATH="/opt/xilinx/xrt/bin:$PATH"
8. 모든 사항 검증 (Validate everything)
다음 명령들을 순서대로 실행하세요:
# 커널 드라이버 + 펌웨어 (Kernel driver + firmware)
flm validate
예상 결과:
[Linux] Kernel: 7.0.12-201.fc44.x86_64
[Linux] NPU: /dev/accel/accel0 with 8 columns
[Linux] NPU FW Version: 1.1.2.65
...
# XRT 레이어 (XRT layer)
xrt-smi examine
예상 결과: [0000:c5:00.1] 위치에 하나의 NPU Strix Halo 장치가 나타납니다.
# 하드웨어 자체 테스트 (Hardware self-test)
xrt-smi validate
예상 결과: gemm, latency(지연 시간), throughput(처리량) 테스트가 PASSED(통과) 되어야 합니다.
중요:
flm validate는 커널 DRM 장치를 확인합니다.flm run은 XRT를 사용합니다. 모델을 실행하기 전에 두 가지 모두 통과해야 합니다.
9. 첫 번째 모델 실행하기 (Run your first model)
flm run gemma4-it:e4b
flm list
flm serve gemma4-it:e4b # 52625 포트에서 실행되는 OpenAI 호환 서버
모델은 첫 실행 시 HuggingFace에서 다운로드됩니다. 기본 저장 경로는 ~/.config/flm/입니다.
대화형 flm run 세션 내부에서 성능 보고 기능을 전환할 수 있습니다:
/verbose # 턴당 TTFT(첫 토큰 생성 시간), prefill tok/s(프리필 토큰/초), decoding tok/s(디코딩 토큰/초)
/status # 토큰 수 및 처리량 요약
컨텍스트 길이(context lengths)에 따른 공식 벤치마크:
flm bench gemma4-it:e4b
10. NPU 상태 모니터링 (Monitor NPU stats)
아직 amdgpu_top이나 Windows 작업 관리자의 NPU 탭에 해당하는 Linux용 도구는 없습니다. XRT(장치 수준)와 FLM(추론 수준) 도구를 조합하여 사용하세요.
빠른 참조 (Quick reference)
| 원하는 정보 | 명령어 |
|---|---|
| 장치 정보, 펌웨어, 토폴로지 (Device info, firmware, topology) | xrt-smi examine |
| ... |
xrt-smi examine 결과가 다를 경우 0000:c5:00.1을 본인의 NPU BDF로 교체하세요.
XRT — 장치 수준 스냅샷 (device-level snapshots)
xrt-smi examine
xrt-smi examine -r all -d 0000:c5:00.1
xrt-smi validate
다른 터미널에서 모델이 실행되는 동안 폴링(Poll)하기:
watch -n1 'xrt-smi examine -r all -d 0000:c5:00.1'
전력 모드 (일부는 루트(root) 권한 필요):
xrt-smi configure --pmode performance -d 0000:c5:00.1
# 모드: default, powersaver, balanced, performance, turbo
FLM — 추론 지표 (inference metrics) (실무에서 가장 유용함)
터미널 1 — 상세 출력(verbose output)과 함께 모델 실행:
flm run gemma4-it:e4b
# 그 다음 /verbose 입력
터미널 2 — NPU 장치 모니터링:
watch -n1 'xrt-smi examine -r all -d 0000:c5:00.1'
터미널 3 (선택 사항) — GPU는 NPU와 분리되어 있음:
amdgpu_top # Radeon iGPU 전용, NPU 아님
커널 디버그 파일 시스템 (Kernel debugfs) (저수준, 루트 권한 필요)
sudo ls /sys/kernel/debug/accel/
sudo ls /sys/kernel/debug/dri/
...
이것들은 실시간 대시보드가 아니라, 필요할 때 읽는 디버그 인터페이스입니다.
NPU 사용률을 표시하지 않는 것들
htop/top— CPU 및 RAM만 표시amdgpu_top/radeontop— GPU만 표시/sys/class/accel/accel0/— 장치 노드 메타데이터, 사용률 그래프 없음
11. 실제 벤치마크 (ROG Flow Z13)
성공적인 설정 이후(Fedora 44, Ryzen AI Max 390, NPU 펌웨어 1.1.2.65, IOMMU 활성화) 본 가이드와 동일한 장비에서 측정되었습니다.
gemma4-it:e4b
flm run gemma4-it:e4b
# 세션 중 /verbose 활성화됨
| 지표 | 결과 |
|---|---|
| TTFT (첫 번째 토큰 생성 시간, time to first token) | 1.21 s |
| ... |
이 수치들은 FLM의 /verbose 출력(프리필(prefill) 및 디코딩(decoding) 토큰/s)에서 가져온 것입니다. 결과는 프롬프트 길이, 컨텍스트 크기(context size), 전력 모드 및 백그라운드 부하에 따라 달라질 수 있습니다.
동일한 하드웨어에서 실행한 xrt-smi validate 결과는 4.4 TOPS (gemm), 평균 지연 시간(latency) 52 µs, 처리량(throughput) ~76k op/s를 기록했습니다. 이는 하드웨어 무결성 검사(sanity check)용으로 유용하며, LLM의 토큰/s와 직접적으로 비교할 수는 없습니다.
문제 해결 (Troubleshooting)
| 증상 (Symptom) | 원인 (Cause) | 해결 방법 (Fix) |
|---|---|---|
libxrt_coreutil.so.2: cannot open shared object file | XRT 라이브러리가 로더 캐시 (loader cache)에 없음 | /opt/xilinx/xrt/lib64를 ld.so.conf.d에 추가한 후, sudo ldconfig 실행 |
| ... |
유용한 디버그 명령 (Useful debug commands)
# NPU PCI 장치
lspci -nn | grep 17f0
...
Fedora XRT 빌드 수정 사항 (Fedora XRT build fixes)
Fedora 44에서 OpenCL 패키징 방식이 변경되었습니다. 이로 인해 업스트림 (Upstream) XRT 빌드가 실패하거나 잘못된 의존성을 가진 RPM이 생성될 수 있습니다. 증상은 다음과 같습니다:
ocl_icd_bindings.cpp에서의 컴파일 에러 (OpenCL 3.0 ICD 구조체 레이아웃 관련)ocl-icd와OpenCL-ICD-Loader간의 RPM 의존성 충돌
본 빌드에 적용된 우회 방법 (Workarounds applied in our build) (업스트림 수정 사항 추적 필요):
- OpenCL 3.0 ICD 호환성을 위해
xrt/src/runtime_src/xocl/api/icd/ocl_icd_bindings.cpp패치 - Fedora에서
OpenCL-ICD-Loader >= 3.0을 요구하도록xrt/src/CMake/cpackLin.cmake패치
업스트림 이슈: Xilinx/XRT #9163
xrtdeps.sh 실행 시 OpenCL 패키지에서 오류가 발생하면 빌드 전에 다음을 설치하세요:
sudo dnf install -y opencl-headers opencl-filesystem OpenCL-ICD-Loader-devel
Fedora에서 도움이 된 빌드 플래그 (Build flags):
./build.sh -npu -opt -disable-werror -noinit -j $(nproc)
-j $(nproc) 사용 시 반드시 공백을 포함하세요. 일부 빌드 스크립트는 -j$(nproc) 형태에서 오류가 발생합니다.
아키텍처: 왜 이렇게 구성 요소가 많은가? (Architecture: why so many pieces?)
┌─────────────────────────────────────────┐
│ flm run / flm serve │ ← FastFlowLM (사용자 인터페이스)
├─────────────────────────────────────────┤
...
빠른 재설정 체크리스트 (미래의 당신을 위한 Quick re-setup checklist)
Fedora를 새로 설치하거나 커널을 업그레이드한 후:
# 1. IOMMU가 비활성화되지 않았는지 확인
grep -q 'amd_iommu=off' /proc/cmdline && echo "FIX GRUB FIRST" || echo "IOMMU OK"
...
참고 문헌 (References)
참고 문헌 (References)
- FastFlowLM — NPU 우선(NPU-first) LLM 런타임
- FastFlowLM Linux docs
- amd/xdna-driver — XRT + NPU 플러그인 소스
- Lemonade NPU Linux guide
- XRT OpenCL Fedora issue #9163
- Strix Halo IOMMU discussion — GPU 대 NPU 트레이드오프
작성된 환경: Fedora 44 + ROG Flow Z13 설정에서 작동함. AMD가 나중에 Fedora 패키지를 배포한다면, 소스 빌드보다 해당 패키지를 사용하는 것을 선호하지만, 위 문제 해결 섹션들은 여전히 적용됨.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기