Skip to content

ci : add Windows On ARM support to release job - #4048

Merged
danbev merged 2 commits into
ggml-org:masterfrom
danbev:woa
Sep 10, 2026
Merged

ci : add Windows On ARM support to release job#4048
danbev merged 2 commits into
ggml-org:masterfrom
danbev:woa

Conversation

@danbev

@danbev danbev commented Sep 9, 2026

Copy link
Copy Markdown
Member

This commit adds Windows On Arm (WoA) support to whisper.cpp and the release process.

The underlying support was already in place as this had been synced with ggml, but the missing part was producesing release artifacts which is what this commit does.


Release artifacts (from fork)

System info:

OS: Windows (ARM64-based PC), build 10.0.28000
CPU/GPU: NVIDIA RTX Spark
Compiler: clang version 22.1.8, Target: aarch64-pc-windows-msv

CPU

Download and unpack:

$ Invoke-WebRequest -Uri "https://github.com/danbev/whisper.cpp/releases/download/b5128/whisper-bin-win-cpu-arm64.zip" -OutFile "whisper-bin-win-cpu-arm64.zip"
$ Expand-Archive -Path "whisper-bin-win-cpu-arm64.zip" -DestinationPath "whisper-bin-win-cpu-arm64"

Run:

$ .\whisper-bin-win-cpu-arm64\Release\whisper-cli.exe -m models\ggml-small.bin -f samples\jfk.wav
load_backend: loaded CPU backend from C:\Users\P14\work\whisper.cpp\whisper-bin-win-cpu-arm64\Release\ggml-cpu.dll
whisper_init_from_file_with_params_no_state: loading model from 'models\ggml-small.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 1
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 768
whisper_model_load: n_audio_head  = 12
whisper_model_load: n_audio_layer = 12
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 768
whisper_model_load: n_text_head   = 12
whisper_model_load: n_text_layer  = 12
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 3 (small)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =   487.01 MB
whisper_model_load: model size    =  487.01 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =   18.87 MB
whisper_init_state: kv cross size =   56.62 MB
whisper_init_state: kv pad  size  =    4.72 MB
whisper_init_state: compute buffer (conv)   =   22.42 MB
whisper_init_state: compute buffer (encode) =   33.85 MB
whisper_init_state: compute buffer (cross)  =    6.20 MB
whisper_init_state: compute buffer (decode) =   97.28 MB
read_audio_data: reading audio data from 'samples\jfk.wav' ...
read_audio_data: trying to decode with miniaudio

system_info: n_threads = 4 / 18 | WHISPER : VITISAI = 0 | COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | MATMUL_INT8 = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing 'samples\jfk.wav' (176000 samples, 11.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = en, task = transcribe, timestamps = 1 ...


[00:00:00.000 --> 00:00:11.000]   And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

whisper_print_timings:     load time =   352.08 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =     7.93 ms
whisper_print_timings:   sample time =    79.87 ms /   147 runs (     0.54 ms per run)
whisper_print_timings:   encode time =  3348.20 ms /     1 runs (  3348.20 ms per run)
whisper_print_timings:   decode time =     6.64 ms /     1 runs (     6.64 ms per run)
whisper_print_timings:   batchd time =   715.97 ms /   144 runs (     4.97 ms per run)
whisper_print_timings:   prompt time =     0.00 ms /     1 runs (     0.00 ms per run)
whisper_print_timings:    total time =  4569.80 ms

opencl-adreno.

Download and unpack:

$  Invoke-WebRequest -Uri "https://github.com/danbev/whisper.cpp/releases/download/b5128/whisper-bin-win-opencl-adreno-arm64.zip" -OutFile "whisper-bin-win-opencl-adreno-arm64.zip"
$  Expand-Archive -Path ".\whisper-bin-win-opencl-adreno-arm64.zip" -DestinationPath "whisper-bin-win-opencl-adreno-arm64"

Run:

$ .\whisper-bin-win-opencl-adreno-arm64\Release\whisper-cli.exe -m models\ggml-small.bin -f samples\jfk.wav
ggml_opencl: selected platform: 'NVIDIA CUDA'

ggml_opencl: device: 'NVIDIA RTX Spark (OpenCL 3.0 CUDA)'
ggml_opencl: unsupported GPU 'NVIDIA RTX Spark '.
ggml_opencl: drop unsupported device 'NVIDIA RTX Spark '.
load_backend: loaded OpenCL backend from C:\Users\P14\work\whisper.cpp\whisper-bin-win-opencl-adreno-arm64\Release\ggml-opencl.dll
load_backend: loaded CPU backend from C:\Users\P14\work\whisper.cpp\whisper-bin-win-opencl-adreno-arm64\Release\ggml-cpu.dll
whisper_init_from_file_with_params_no_state: loading model from 'models\ggml-small.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 2
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 768
whisper_model_load: n_audio_head  = 12
whisper_model_load: n_audio_layer = 12
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 768
whisper_model_load: n_text_head   = 12
whisper_model_load: n_text_layer  = 12
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 3 (small)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =   487.01 MB
whisper_model_load: model size    =  487.01 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =   18.87 MB
whisper_init_state: kv cross size =   56.62 MB
whisper_init_state: kv pad  size  =    4.72 MB
whisper_init_state: compute buffer (conv)   =   22.42 MB
whisper_init_state: compute buffer (encode) =   33.85 MB
whisper_init_state: compute buffer (cross)  =    6.20 MB
whisper_init_state: compute buffer (decode) =   97.28 MB
read_audio_data: reading audio data from 'samples\jfk.wav' ...
read_audio_data: trying to decode with miniaudio

system_info: n_threads = 4 / 18 | WHISPER : VITISAI = 0 | COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | MATMUL_INT8 = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing 'samples\jfk.wav' (176000 samples, 11.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = en, task = transcribe, timestamps = 1 ...


[00:00:00.000 --> 00:00:11.000]   And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

whisper_print_timings:     load time =   357.59 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =     6.85 ms
whisper_print_timings:   sample time =    94.17 ms /   147 runs (     0.64 ms per run)
whisper_print_timings:   encode time =  3556.36 ms /     1 runs (  3556.36 ms per run)
whisper_print_timings:   decode time =    10.94 ms /     1 runs (    10.94 ms per run)
whisper_print_timings:   batchd time =   768.50 ms /   144 runs (     5.34 ms per run)
whisper_print_timings:   prompt time =     0.00 ms /     1 runs (     0.00 ms per run)
whisper_print_timings:    total time =  4813.57 ms

CUDA 13.4

Download and unpack:

$  Invoke-WebRequest -Uri "https://github.com/danbev/whisper.cpp/releases/download/b5130/whisper-bin-win-cuda-13.4.0-arm64.zip" -OutFile "whisper-bin-win-cuda-13.4.0-arm64.zip"
$  Expand-Archive -Path ".\whisper-bin-win-cuda-13.4.0-arm64.zip" -DestinationPath "whisper-bin-win-cuda-13.4.0-arm64"

Run:

$ .\whisper-bin-win-cuda-13.4.0-arm64\Release\whisper-cli.exe -m .\models\ggml-small.bin -f .\samples\jfk.wav
ggml_cuda_init: found 1 CUDA devices (Total VRAM: 46477 MiB):
  Device 0: NVIDIA RTX Spark (5120-core Blackwell RTX GPU), compute capability 12.1, VMM: yes, VRAM: 46477 MiB
load_backend: loaded CUDA backend from C:\Users\P14\work\whisper.cpp\whisper-bin-win-cuda-13.4.0-arm64\Release\ggml-cuda.dll
load_backend: loaded CPU backend from C:\Users\P14\work\whisper.cpp\whisper-bin-win-cuda-13.4.0-arm64\Release\ggml-cpu.dll
whisper_init_from_file_with_params_no_state: loading model from '.\models\ggml-small.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 2
whisper_init_with_params_no_state: backends   = 2
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 768
whisper_model_load: n_audio_head  = 12
whisper_model_load: n_audio_layer = 12
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 768
whisper_model_load: n_text_head   = 12
whisper_model_load: n_text_layer  = 12
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 3 (small)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:        CUDA0 total size =   487.01 MB
whisper_model_load: model size    =  487.01 MB
whisper_backend_init_gpu: device 0: CUDA0 (type: 2)
whisper_backend_init_gpu: found GPU device 0: CUDA0 (type: 2, cnt: 0)
whisper_backend_init_gpu: using CUDA0 backend
whisper_init_state: kv self size  =   18.87 MB
whisper_init_state: kv cross size =   56.62 MB
whisper_init_state: kv pad  size  =    4.72 MB
whisper_init_state: compute buffer (conv)   =   23.38 MB
whisper_init_state: compute buffer (encode) =   33.85 MB
whisper_init_state: compute buffer (cross)  =    6.20 MB
whisper_init_state: compute buffer (decode) =   98.21 MB
read_audio_data: reading audio data from '.\samples\jfk.wav' ...
read_audio_data: trying to decode with miniaudio

system_info: n_threads = 4 / 18 | WHISPER : VITISAI = 0 | COREML = 0 | OPENVINO = 0 | CUDA : ARCHS = 750,800,860,890,900,1200,1210 | BLACKWELL_NATIVE_FP4 = 1 | CPU : NEON = 1 | ARM_FMA = 1 | MATMUL_INT8 = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing '.\samples\jfk.wav' (176000 samples, 11.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = en, task = transcribe, timestamps = 1 ...


[00:00:00.000 --> 00:00:11.000]   And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

whisper_print_timings:     load time =   419.07 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =     6.44 ms
whisper_print_timings:   sample time =    78.49 ms /   147 runs (     0.53 ms per run)
whisper_print_timings:   encode time =   131.90 ms /     1 runs (   131.90 ms per run)
whisper_print_timings:   decode time =    18.99 ms /     1 runs (    18.99 ms per run)
whisper_print_timings:   batchd time =   314.85 ms /   144 runs (     2.19 ms per run)
whisper_print_timings:   prompt time =     0.00 ms /     1 runs (     0.00 ms per run)
whisper_print_timings:    total time =   990.31 ms

@danbev danbev changed the title ci : add Windows On ARM support to release job (wip) ci : add Windows On ARM support to release job Sep 9, 2026
@danbev
danbev marked this pull request as ready for review September 9, 2026 06:42
@danbev
danbev marked this pull request as draft September 9, 2026 07:04
This commit adds Windows On Arm (WoA) support to whisper.cpp and the
release process.

The underlying support was already in place as this had been synced
with ggml, but the missing part was producesing release artifacts which
is what this commit does.
@danbev
danbev requested a review from ggerganov September 10, 2026 07:40
@danbev
danbev merged commit 6fb4cd6 into ggml-org:master Sep 10, 2026
@danbev
danbev deleted the woa branch September 10, 2026 07:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants