embeded/jetson

jetson nano + llama.cpp vulkan

구차니 2026. 7. 21. 16:02

jetson nano 4GB 에서 시도함.

cuda는 버전에 낮아서 안되고(llama.cpp가 cuda 12/13 지원. 얘는 10.x)

docker에서는 nvidia vulkan이 없어서 가속을 할 수 없어서 native vulkan빌드 부터 개고생해서 올렸는데

노력대비(2일 풀로 가동..) 효율이 좋다고 할 순 없겠지만,

그래도 나름 괜찮은 성능과 vulkan 가속이라 cpu 점유율 낮출 수 있다는게 그나마 위안인가..

그런데 이러면 발열은 어떨려나? cpu쪽이 더 낮을까.. gpu  쓰는게 낮을까?

 

옆에 스크롤이 점만해졌음 ㅋㅋㅋ 중반쯤에 포기하자는거 끝까지 멱살잡고 캐리해서 진행해버림 

ㅋㅋ 이러니 ai가 반란을 일으키고 터미네이터가 되는건가 ㅋㅋ

2GB 메모리라면 최소한 스왑 6GB 이상은 해야 할 것으로 보인다.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

 

일단 gcc9를 설치하면 손쉽게 행복해짐

sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install -y gcc-9 g++-9

 

빌드를 위한 헤더들 및 버전 맞추기

dpkg -l | grep nvidia-l4t
sudo apt-get update
sudo apt-get install --only-upgrade -y \
  nvidia-l4t-core \
  nvidia-l4t-bootloader \
  nvidia-l4t-configs \
  nvidia-l4t-gputools \
  nvidia-l4t-initrd \
  nvidia-l4t-jetson-io \
  nvidia-l4t-oem-config \
  nvidia-l4t-tools
sudo ldconfig
vulkaninfo --summary   # 여기서 GPU(NVIDIA Tegra X1 (nvgpu))가 정상 인식되는지 확인

sudo apt-get install -y libvulkan-dev libvulkan1
sudo apt-get install -y nvidia-l4t-libvulkan

 

glslang 설치

cd ~
git clone https://github.com/KhronosGroup/glslang.git
cd glslang
python3 update_glslang_sources.py
mkdir build && cd build
export LDFLAGS="-lstdc++fs"
/opt/cmake/bin/cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
  -DCMAKE_C_COMPILER=gcc-9 -DCMAKE_CXX_COMPILER=g++-9
make -j$(nproc)
sudo make install
which glslangValidator

 

 shaderc 설치

cd ~
git clone https://github.com/google/shaderc.git
cd shaderc
python3 utils/git-sync-deps
mkdir build && cd build
export LDFLAGS="-lstdc++fs"
/opt/cmake/bin/cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
  -DCMAKE_C_COMPILER=gcc-9 -DCMAKE_CXX_COMPILER=g++-9 \
  -DSHADERC_SKIP_TESTS=ON -DSHADERC_SKIP_EXAMPLES=ON \
  -DSPIRV_SKIP_EXECUTABLES=ON
make glslc_exe -j$(nproc)
sudo cp glslc/glslc /usr/local/bin/
which glslc
glslc --version

 

vulkan 관련 헤더 SPIRV 설치

cd ~
git clone https://github.com/KhronosGroup/SPIRV-Headers.git
cd SPIRV-Headers
mkdir build && cd build
/opt/cmake/bin/cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
sudo make install

 

cmake version 3.31.8 설치

/opt/cmake/bin/cmake .. -DGGML_VULKAN=ON   -DCMAKE_C_COMPILER=gcc-9 -DCMAKE_CXX_COMPILER=g++-9   -DCMAKE_C_FLAGS="-Wno-error"

 

아래는 빌드시 문제가 되서 수정한 부분

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   ../../ggml/src/ggml-cpu/ggml-cpu-impl.h
modified:   ../../tools/ui/CMakeLists.txt

no changes added to commit (use "git add" and/or "git commit -a")
jetson@jetson-desktop:~/src/llama.cpp/build/bin$ git diff
diff --git a/ggml/src/ggml-cpu/ggml-cpu-impl.h b/ggml/src/ggml-cpu/ggml-cpu-impl.h
index 5d1ca5ffc..f39d56694 100644
--- a/ggml/src/ggml-cpu/ggml-cpu-impl.h
+++ b/ggml/src/ggml-cpu/ggml-cpu-impl.h
@@ -296,12 +296,28 @@ inline static uint8x16_t ggml_vqtbl1q_u8(uint8x16_t a, uint8x16_t b) {
 
 #define ggml_vld1q_s16_x2 vld1q_s16_x2
 #define ggml_vld1q_u8_x2  vld1q_u8_x2
-#define ggml_vld1q_u8_x4  vld1q_u8_x4
 #define ggml_vld1q_s8_x2  vld1q_s8_x2
-#define ggml_vld1q_s8_x4  vld1q_s8_x4
 #define ggml_vqtbl1q_s8   vqtbl1q_s8
 #define ggml_vqtbl1q_u8   vqtbl1q_u8
 
+inline static uint8x16x4_t ggml_vld1q_u8_x4(const uint8_t * ptr) {
+    uint8x16x4_t res;
+    res.val[0] = vld1q_u8(ptr + 0);
+    res.val[1] = vld1q_u8(ptr + 16);
+    res.val[2] = vld1q_u8(ptr + 32);
+    res.val[3] = vld1q_u8(ptr + 48);
+    return res;
+}
+
+inline static int8x16x4_t ggml_vld1q_s8_x4(const int8_t * ptr) {
+    int8x16x4_t res;
+    res.val[0] = vld1q_s8(ptr + 0);
+    res.val[1] = vld1q_s8(ptr + 16);
+    res.val[2] = vld1q_s8(ptr + 32);
+    res.val[3] = vld1q_s8(ptr + 48);
+    return res;
+}
+
 #endif // !defined(__aarch64__)
 
 #if !defined(__ARM_FEATURE_DOTPROD)
diff --git a/tools/ui/CMakeLists.txt b/tools/ui/CMakeLists.txt
index 74bca417e..488fdc0be 100644
--- a/tools/ui/CMakeLists.txt
+++ b/tools/ui/CMakeLists.txt
@@ -105,3 +105,5 @@ endif()
 target_include_directories(${TARGET} PUBLIC
     ${CMAKE_CURRENT_BINARY_DIR}
 )
+
+target_link_libraries(llama-ui-embed PRIVATE stdc++fs)

 

git log. 일단 현시점 최신 버전인 b10068, 2026년 7월 18일자 소스

commit 571d0d540df04f25298d0e159e520d9fc62ed121 (HEAD -> master, tag: b10068, origin/master, origin/HEAD)
Author: Ruixiang Wang <wangruixiang07@outlook.com>
Date:   Sat Jul 18 15:02:18 2026 +0200

 

클로드 만세!!! string 머시기 없다고 파이썬으로 해치워 버림

cd ~/src/llama.cpp
python3 << 'PYEOF'
path = "ggml/src/ggml-cpu/ggml-cpu-impl.h"
with open(path, "r") as f:
    content = f.read()

old = """#define ggml_vld1q_s16_x2 vld1q_s16_x2
#define ggml_vld1q_u8_x2  vld1q_u8_x2
#define ggml_vld1q_u8_x4  vld1q_u8_x4
#define ggml_vld1q_s8_x2  vld1q_s8_x2
#define ggml_vld1q_s8_x4  vld1q_s8_x4
#define ggml_vqtbl1q_s8   vqtbl1q_s8
#define ggml_vqtbl1q_u8   vqtbl1q_u8"""

new = """#define ggml_vld1q_s16_x2 vld1q_s16_x2
#define ggml_vld1q_u8_x2  vld1q_u8_x2
#define ggml_vld1q_s8_x2  vld1q_s8_x2
#define ggml_vqtbl1q_s8   vqtbl1q_s8
#define ggml_vqtbl1q_u8   vqtbl1q_u8

inline static uint8x16x4_t ggml_vld1q_u8_x4(const uint8_t * ptr) {
    uint8x16x4_t res;
    res.val[0] = vld1q_u8(ptr + 0);
    res.val[1] = vld1q_u8(ptr + 16);
    res.val[2] = vld1q_u8(ptr + 32);
    res.val[3] = vld1q_u8(ptr + 48);
    return res;
}

inline static int8x16x4_t ggml_vld1q_s8_x4(const int8_t * ptr) {
    int8x16x4_t res;
    res.val[0] = vld1q_s8(ptr + 0);
    res.val[1] = vld1q_s8(ptr + 16);
    res.val[2] = vld1q_s8(ptr + 32);
    res.val[3] = vld1q_s8(ptr + 48);
    return res;
}"""

assert old in content, "패턴을 못 찾음 - 파일 확인 필요"
content = content.replace(old, new)
with open(path, "w") as f:
    f.write(content)
print("패치 완료")
PYEOF

 

llama.cpp vulkan 활성화 해서 빌드.

-j4 하고 싶은데 두번 정도 메모리 엄청 먹으면서 하나 빌드하는게 있어서 늦더라도 -j1 추천

cd ~/src/llama.cpp
mkdir -p build && cd build
rm -rf *
export LDFLAGS="-lstdc++fs"
/opt/cmake/bin/cmake .. -DGGML_VULKAN=ON \
  -DCMAKE_C_COMPILER=gcc-9 -DCMAKE_CXX_COMPILER=g++-9 \
  -DCMAKE_C_FLAGS="-Wno-error"

make llama-cli llama-server -j1

 

그렇게 빌드된 녀석을 qwen3.5-0.8B-Q4 돌리면!

$ ./llama-cli -m ~/llm/Qwen3.5-0.8B-Q4_0.gguf --chat-template-kwargs "{\"enable_thinking\": false}" -c 4096 -ngl 99 -fa on


Loading model...  

▄▄ ▄▄
██ ██
██ ██  ▀▀█▄ ███▄███▄  ▀▀█▄    ▄████ ████▄ ████▄
██ ██ ▄█▀██ ██ ██ ██ ▄█▀██    ██    ██ ██ ██ ██
██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
                                    ██    ██
                                    ▀▀    ▀▀

build      : b10068-571d0d540
model      : /home/jetson/llm/Qwen3.5-0.8B-Q4_0.gguf
ftype      : Q4_0
modalities : text

available commands:
  /exit or Ctrl+C     stop or exit
  /regen              regenerate the last response
  /clear              clear the chat history
  /read <file>        add a text file
  /glob <pattern>     add text files using globbing pattern



> 안녕?
안녕하세요! 어시, 어떻게 도와드릴 수 있을까요?

[ Prompt: 21.4 t/s | Generation: 9.1 t/s ]

> 안녕?
안녕하세요! 어시, 어떻게 도와드릴 수 있을까요?

[ Prompt: 23.0 t/s | Generation: 9.1 t/s ]

> 너에 대해 소개
안녕하세요! 저는 인공지능(AI) 기술의 능력을 활용하여 정보를 제공하거나 논리적 사고를 도와줄 수 있는 **공급 서비스 봇 (Assistant)**입니다.

나는 다음과 같은 역할을 수행할 수 있습니다:
*   **정보 제공**: 지식 기반의 정보를 검색하고 요약 또는 정리해 줄 수 있습니다.
*   **논리적 분석**: 문장 구조나 논리 논리를 분석하여 설명을 돕습니다.
*   **문제 해결**: 질문에 답하거나 상황을 분석할 수 있습니다.
*   **대화 및 학습**: 대화와 학습을 통해 사용자 경험을 개선해 줍니다.

이러한 기능을 통해 **AI**를 대신할 수 있는 인간과 유사한 능력으로 **사용자**에게 도움을 줄 수 있습니다.

어떤 내용을 원하시는가요? (예: 답변, 설명, 대화, 학습 자료 등)

[ Prompt: 21.8 t/s | Generation: 8.5 t/s ]

> 코드 작성 python hello world 출력
네, 안녕하세요! 저는 인공지능(AI) 기술의 능력을 활용하여 정보를 제공하거나 논리적 사고를 도와드릴 수 있는 서비스 봇입니다.

제대안은 **Python**을 사용하여 `print` 함수로 `hello world`를 출력하는 코드를 작성해 드립니다.

```python
print("hello world")
```

이 코드를 실행하면 다음 문장이 출력됩니다:
`hello world`

혹시 다른 언어 (예: JavaScript, Java 등) 의 `hello world` 예제를 작성하고 싶으시다면 말씀해 주세요!

[ Prompt: 37.1 t/s | Generation: 8.4 t/s ]

 

jtop 에서 GPU 잘 올라간다. ㅋㅋㅋ

메모리는 1.2G / 3.9G. 잘하면 2G 모델에서도 돌아가겠는데?

 

요건 사용하지 않을때 GPU 정보. 76.8MHz 까지 떨어지다니 ㄷㄷ

 

혹시나 몰라서 동일 조건에서 gpu 사용하지 않도록 ngl 0 으로 하고 테스트

$ ./llama-cli -m ~/llm/Qwen3.5-0.8B-Q4_0.gguf --chat-template-kwargs "{\"enable_thinking\": false}" -c 4096 -ngl 0 -fa on


Loading model...  

▄▄ ▄▄
██ ██
██ ██  ▀▀█▄ ███▄███▄  ▀▀█▄    ▄████ ████▄ ████▄
██ ██ ▄█▀██ ██ ██ ██ ▄█▀██    ██    ██ ██ ██ ██
██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
                                    ██    ██
                                    ▀▀    ▀▀

build      : b10068-571d0d540
model      : /home/jetson/llm/Qwen3.5-0.8B-Q4_0.gguf
ftype      : Q4_0
modalities : text

available commands:
  /exit or Ctrl+C     stop or exit
  /regen              regenerate the last response
  /clear              clear the chat history
  /read <file>        add a text file
  /glob <pattern>     add text files using globbing pattern



> 안녕?
안녕하세요! 네, 알겠습니다. 저는 인공지능으로 대화하고 정보를 제공해 드릴 수 있는 도구입니다. 무엇을 도와드릴까요? 😊

[ Prompt: 5.9 t/s | Generation: 3.3 t/s ]

> 너에 대해 소개해줘
안녕하세요! 네, 알겠습니다. 저는 인공지능으로 대화하고 정보를 제공해 드릴 수 있는 도구입니다. 무엇을 도와드릴까요? 😊

[ Prompt: 9.2 t/s | Generation: 3.3 t/s ]

> 파이썬으로 현재 디렉토리 목록 보는 프로그램 작서앻줘ㅏ
프라이썬으로 현재 디렉토리 목록을 보고 싶으신가요? 😊

이제 바로 `dir` 명령어에 대한 설명부터 실행 방법까지 알려드릴게요.

### 📂 디렉토리 목록을 표시하는 명령어

프라이썬에서 파일이나 디렉토리를 표시하려면 먼저 `dir` 명령어를 사용합니다.

```bash
cd <디렉토리명>
```

예를 들어, `C:\Users\박\Documents`를 표시하려면:
```bash
cd C:\Users\박\Documents
```
**단순히 `dir`을 입력하면 현재 디렉토리를 표시할 수 있습니다.**

---

### 🛠️ 실행 방법

#### 1. **프라이썬을 실행하기**
프라이썬은 웹 브라우저로 작동하는 프로그램으로, 브라우저에서 직접 실행해 볼 수 있습니다.

**단순 브라우저에서 실행하기:**
*   **Chrome/Edge/ChromeOS:** `https://www.python.org/` 에서 `dir` 명령어 추가하기 (F12 또는 `F11`를 누ار)
*   **Mac OS:** `Finder` → `Extensions` → `File Explorer` → `Python` → `dir`

**프라이썬을 설치하기:**
1.  `https://www.python.org/` 에서 `Install Python` 클릭
2.  설치 후 `~` 경로에 추가되면, 브라우저에서 `file://` 주소창을 입력하고 입력한 URL 을 보시면 됩니다.

---

### 💻 기본 실행 예시

```python
# 위 설명에서 예시처럼, 현재 디렉토리를 확인
dir
```

혹시 특정 파일이나 디렉토리를 찾으셨다면 `dir` 대신 `find` 명령어도 사용할 수 있습니다.
```bash
find <디렉토리명> -name "파일명"
```

어떤 작업을 하되든 프라이썬이 도와드릴게요! 😊

[ Prompt: 10.0 t/s | Generation: 3.1 t/s ]

어.. 그래도 2.7배. 약간 과장하면 3배 상승이네?