Skip to content

Commit d9f50fa

Browse files
hexagon: update to hex-sdk 6.4.0 and add scripts for running on QDC
1 parent 11db5c2 commit d9f50fa

File tree

6 files changed

+110
-30
lines changed

6 files changed

+110
-30
lines changed

.github/workflows/build.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,16 +1347,16 @@ jobs:
13471347
id: install_hexsdk
13481348
if: ${{ matrix.build == 'arm64-snapdragon' }}
13491349
env:
1350-
HEXSDK_VER: 6.3.0
1350+
HEXSDK_VER: 6.4.0.2
13511351
HEXTLS_VER: 19.0.04
13521352
run: |
13531353
curl -L -o hex-sdk.tar.gz https://github.com/snapdragon-toolchain/hexagon-sdk/releases/download/v$HEXSDK_VER/hexagon-sdk-v$HEXSDK_VER-amd64-lnx.tar.xz
13541354
mkdir hex-sdk
13551355
tar -xaf hex-sdk.tar.gz -C hex-sdk
13561356
ls -l hex-sdk
13571357
sudo mv hex-sdk /opt/hexagon
1358-
echo "HEXAGON_SDK_ROOT=/opt/hexagon/$HEXSDK_VER.0" >> "$GITHUB_ENV"
1359-
echo "HEXAGON_TOOLS_ROOT=/opt/hexagon/$HEXSDK_VER.0/tools/HEXAGON_Tools/$HEXTLS_VER" >> "$GITHUB_ENV"
1358+
echo "HEXAGON_SDK_ROOT=/opt/hexagon/$HEXSDK_VER" >> "$GITHUB_ENV"
1359+
echo "HEXAGON_TOOLS_ROOT=/opt/hexagon/$HEXSDK_VER/tools/HEXAGON_Tools/$HEXTLS_VER" >> "$GITHUB_ENV"
13601360
echo "DEFAULT_HLOS_ARCH=64" >> "$GITHUB_ENV"
13611361
echo "DEFAULT_TOOLS_VARIANT=toolv19" >> "$GITHUB_ENV"
13621362
echo "DEFAULT_NO_QURT_INC=0" >> "$GITHUB_ENV"
@@ -1373,7 +1373,7 @@ jobs:
13731373
run: |
13741374
cmake ${{ matrix.defines }} -B build
13751375
cmake --build build
1376-
cmake --install build --prefix pkg
1376+
cmake --install build --prefix pkg-adb/llama.cpp
13771377
13781378
- name: Test
13791379
id: cmake_test

docs/backend/hexagon/README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ This image includes Android NDK, OpenCL SDK, Hexagon SDK, CMake, etc.
88
This method works on Linux, macOS, and Windows. macOS and Windows users should install Docker Desktop.
99

1010
```
11-
~/src/llama.cpp$ docker run -it -u $(id -u):$(id -g) --volume $(pwd):/workspace --platform linux/amd64 ghcr.io/snapdragon-toolchain/arm64-android:v0.2
11+
~/src/llama.cpp$ docker run -it -u $(id -u):$(id -g) --volume $(pwd):/workspace --platform linux/amd64 ghcr.io/snapdragon-toolchain/arm64-android:v0.3
1212
[d]/> cd /workspace
1313
```
1414

@@ -26,7 +26,7 @@ Preset CMake variables:
2626
GGML_HEXAGON="ON"
2727
GGML_OPENCL="ON"
2828
GGML_OPENMP="OFF"
29-
HEXAGON_SDK_ROOT="/opt/hexagon/6.3.0.0"
29+
HEXAGON_SDK_ROOT="/opt/hexagon/6.4.0.2"
3030
...
3131
-- Including OpenCL backend
3232
-- Including Hexagon backend
@@ -49,19 +49,19 @@ Preset CMake variables:
4949
To generate an installable "package" simply use cmake --install:
5050

5151
```
52-
[d]/workspace> cmake --install build-snapdragon --prefix pkg-snapdragon
52+
[d]/workspace> cmake --install build-snapdragon --prefix pkg-adb/llama.cpp
5353
-- Install configuration: "Release"
54-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-cpu.so
55-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-opencl.so
56-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-hexagon.so
57-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-htp-v73.so
58-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-htp-v75.so
59-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-htp-v79.so
60-
-- Installing: /workspace/pkg-snapdragon/lib/libggml-htp-v81.so
61-
-- Installing: /workspace/pkg-snapdragon/lib/libggml.so
54+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-cpu.so
55+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-opencl.so
56+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-hexagon.so
57+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-htp-v73.so
58+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-htp-v75.so
59+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-htp-v79.so
60+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml-htp-v81.so
61+
-- Installing: /workspace/pkg-adb/llama.cpp/lib/libggml.so
6262
...
63-
-- Installing: /workspace/pkg-snapdragon/bin/llama-bench
64-
-- Installing: /workspace/pkg-snapdragon/bin/llama-cli
63+
-- Installing: /workspace/pkg-adb/llama.cpp/bin/llama-bench
64+
-- Installing: /workspace/pkg-adb/llama.cpp/bin/llama-cli
6565
...
6666
```
6767

@@ -74,10 +74,10 @@ Once ADB is enabled, use `adb push` to install `pkg-snapdragon` on the device.
7474
**Note that the toolchain Docker image doesn't have ADB and doesn't set up the ADB bridge. Please use native ADB on the host.**
7575

7676
```
77-
~/src/llama.cpp$ adb push pkg-snapdragon/* /data/local/tmp/llama.cpp
78-
pkg-snapdragon/bin/: 67 files pushed, 0 skipped. 190.2 MB/s (919095042 bytes in 4.607s)
79-
pkg-snapdragon/include/: 19 files pushed, 0 skipped. 20.5 MB/s (255173 bytes in 0.012s)
80-
pkg-snapdragon/lib/: 16 files pushed, 0 skipped. 144.4 MB/s (43801382 bytes in 0.289s)
77+
~/src/llama.cpp$ adb push pkg-adb/llama.cpp /data/local/tmp/
78+
pkg-adb/llama.cpp/bin/: 67 files pushed, 0 skipped. 190.2 MB/s (919095042 bytes in 4.607s)
79+
pkg-adb/llama.cpp/include/: 19 files pushed, 0 skipped. 20.5 MB/s (255173 bytes in 0.012s)
80+
pkg-adb/llama.cpp/lib/: 16 files pushed, 0 skipped. 144.4 MB/s (43801382 bytes in 0.289s)
8181
102 files pushed, 0 skipped. 186.9 MB/s (963151597 bytes in 4.914s)
8282
```
8383

docs/backend/hexagon/developer.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ The Hexagon backend consist of two parts:
1414
Here is an example of the build artifacts
1515

1616
```
17-
~/src/llama.cpp$ ls -l pkg-snapdragon/lib/libggml*
18-
pkg-snapdragon/lib/libggml-base.so
19-
pkg-snapdragon/lib/libggml-cpu.so
20-
pkg-snapdragon/lib/libggml-hexagon.so <<< CPU library
21-
pkg-snapdragon/lib/libggml-htp-v73.so <<< HTP op/kernels for Hexagon v73
22-
pkg-snapdragon/lib/libggml-htp-v75.so
23-
pkg-snapdragon/lib/libggml-htp-v79.so
24-
pkg-snapdragon/lib/libggml-htp-v81.so
17+
~/src/llama.cpp$ ls -l pkg-adb/llama.cpp/lib/libggml*
18+
pkg-adb/llama.cpp/lib/libggml-base.so
19+
pkg-adb/llama.cpp/lib/libggml-cpu.so
20+
pkg-adb/llama.cpp/lib/libggml-hexagon.so <<< CPU library
21+
pkg-adb/llama.cpp/lib/libggml-htp-v73.so <<< HTP op/kernels for Hexagon v73
22+
pkg-adb/llama.cpp/lib/libggml-htp-v75.so
23+
pkg-adb/llama.cpp/lib/libggml-htp-v79.so
24+
pkg-adb/llama.cpp/lib/libggml-htp-v81.so
2525
```
2626

2727
## Memory buffers
@@ -49,7 +49,7 @@ Each Hexagon device behaves like a GPU from the offload and model splitting pers
4949
Here is an example of running GPT-OSS-20B model on a newer Snapdragon device with 16GB of DDR.
5050

5151
```
52-
M=gpt-oss-20b-Q4_0.gguf NDEV=4 D=HTP0,HTP1,HTP2,HTP3 P=surfing.txt docs/backend/hexagon/run-cli.sh -no-cnv -f surfing.txt -n 32
52+
M=gpt-oss-20b-Q4_0.gguf NDEV=4 D=HTP0,HTP1,HTP2,HTP3 P=surfing.txt scripts/snapdragon/adb/run-cli.sh -no-cnv -f surfing.txt -n 32
5353
...
5454
LD_LIBRARY_PATH=/data/local/tmp/llama.cpp/lib
5555
ADSP_LIBRARY_PATH=/data/local/tmp/llama.cpp/lib

scripts/snapdragon/qdc/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This directory includes pytest based scripts for running CI jobs on Qualcomm Device Cloud (QDC).
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Appium-Python-Client==5.2.4
2+
attrs==25.4.0
3+
certifi==2025.10.5
4+
exceptiongroup==1.3.0
5+
h11==0.16.0
6+
idna==3.11
7+
iniconfig==2.1.0
8+
outcome==1.3.0.post0
9+
packaging==25.0
10+
pluggy==1.6.0
11+
Pygments==2.19.2
12+
PySocks==1.7.1
13+
pytest==8.4.2
14+
pytest-dependency==0.6.0
15+
selenium==4.36.0
16+
setuptools==80.9.0
17+
sniffio==1.3.1
18+
sortedcontainers==2.4.0
19+
tomli==2.3.0
20+
trio==0.31.0
21+
trio-websocket==0.12.2
22+
typing_extensions==4.15.0
23+
urllib3==2.5.0
24+
websocket-client==1.9.0
25+
wsproto==1.2.0
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import pytest,subprocess,sys
2+
3+
tmp_path='/data/local/tmp'
4+
pkg_path=f'{tmp_path}/llama.cpp'
5+
lib_path=f'{pkg_path}/lib'
6+
bin_path=f'{pkg_path}/bin'
7+
8+
model='../gguf/Llama-3.2-1B-Instruct-Q4_0.gguf'
9+
cli_pref=f'cd {pkg_path} && LD_LIBRARY_PATH={lib_path} ADSP_LIBRARY_PATH={lib_path} {bin_path}'
10+
11+
def run_cmd(cmd):
12+
p = subprocess.run(cmd, text = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
13+
sys.stdout.write(p.stdout)
14+
assert(p.returncode == 0)
15+
16+
@pytest.mark.dependency()
17+
def test_install():
18+
run_cmd([ 'adb', 'push', 'llama.cpp', f'{tmp_path}' ])
19+
run_cmd([ 'adb', 'shell', f'chmod 755 {bin_path}/*' ])
20+
21+
## Basic cli tests
22+
def run_llama_cli(dev, opts):
23+
run_cmd([ 'adb', 'shell',
24+
f'{cli_pref}/llama-cli -m {model} --device {dev} -ngl 99 --batch-size 128 -n 128 -t 4 -no-cnv --seed 42 {opts} ' +
25+
f'-p "what is the most popular cookie in the world?\nPlease provide a very brief bullet point summary.\nBegin your answer with **BEGIN**."'
26+
])
27+
28+
@pytest.mark.dependency(depends=['test_install'])
29+
def test_llama_cli_cpu():
30+
run_llama_cli('none', '-ctk q8_0 -ctv q8_0 -fa on')
31+
32+
@pytest.mark.dependency(depends=['test_install'])
33+
def test_llama_cli_gpu():
34+
run_llama_cli('GPUOpenCL', '-fa on')
35+
36+
@pytest.mark.dependency(depends=['test_install'])
37+
def test_llama_cli_npu():
38+
run_llama_cli('HTP0', '-ctk q8_0 -ctv q8_0 -fa on')
39+
40+
## Basic bench tests
41+
def run_llama_bench(dev):
42+
run_cmd([ 'adb', 'shell',
43+
f'{cli_pref}/llama-bench -m {model} --device {dev} -ngl 99 --batch-size 128 -t 4 -p 128 -n 32'
44+
])
45+
46+
@pytest.mark.dependency(depends=['test_install'])
47+
def test_llama_bench_cpu():
48+
run_llama_bench('none')
49+
50+
def test_llama_bench_gpu():
51+
run_llama_bench('GPUOpenCL')
52+
53+
def test_llama_bench_npu():
54+
run_llama_bench('HTP0')

0 commit comments

Comments
 (0)