whispercpp 1.3.7 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -4
- data/ext/options.rb +1 -1
- data/ext/ruby_whisper.c +0 -1
- data/ext/ruby_whisper.h +7 -1
- data/ext/ruby_whisper_context.c +50 -1
- data/ext/ruby_whisper_log_settable.h +1 -2
- data/ext/ruby_whisper_params.c +9 -8
- data/ext/ruby_whisper_transcribe.cpp +0 -19
- data/ext/ruby_whisper_vad_context.c +30 -10
- data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
- data/ext/ruby_whisper_vad_params.c +4 -4
- data/ext/ruby_whisper_vad_segment.c +2 -2
- data/ext/sources/CMakeLists.txt +2 -1
- data/ext/sources/cmake/parakeet.pc.in +2 -2
- data/ext/sources/cmake/whisper.pc.in +2 -2
- data/ext/sources/examples/cli/cli.cpp +9 -1
- data/ext/sources/examples/common-ggml.cpp +2 -0
- data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
- data/ext/sources/ggml/CMakeLists.txt +3 -4
- data/ext/sources/ggml/include/ggml-cuda.h +0 -3
- data/ext/sources/ggml/include/ggml-sycl.h +8 -0
- data/ext/sources/ggml/include/ggml.h +3 -1
- data/ext/sources/ggml/src/CMakeLists.txt +8 -1
- data/ext/sources/ggml/src/ggml-backend-meta.cpp +7 -4
- data/ext/sources/ggml/src/ggml-common.h +13 -2
- data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +1 -1
- data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +5 -6
- data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +78 -4
- data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +142 -4
- data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +7 -2
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +14 -0
- data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +26 -19
- data/ext/sources/ggml/src/ggml-cpu/ops.cpp +129 -46
- data/ext/sources/ggml/src/ggml-cpu/quants.c +51 -0
- data/ext/sources/ggml/src/ggml-cpu/quants.h +3 -0
- data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +1 -1
- data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +11 -0
- data/ext/sources/ggml/src/ggml-cpu/vec.cpp +2 -2
- data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +90 -46
- data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
- data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
- data/ext/sources/ggml/src/ggml-cuda/common.cuh +4 -0
- data/ext/sources/ggml/src/ggml-cuda/concat.cu +33 -21
- data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
- data/ext/sources/ggml/src/ggml-cuda/convert.cu +86 -34
- data/ext/sources/ggml/src/ggml-cuda/cpy.cu +80 -29
- data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +9 -5
- data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +4 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +9 -5
- data/ext/sources/ggml/src/ggml-cuda/fattn.cu +27 -21
- data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +40 -25
- data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
- data/ext/sources/ggml/src/ggml-cuda/getrows.cu +15 -12
- data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +718 -1248
- data/ext/sources/ggml/src/ggml-cuda/mmq.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +77 -40
- data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +55 -12
- data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +64 -4
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
- data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +7 -1
- data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +1 -0
- data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +1 -0
- data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +0 -5
- data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +1634 -1293
- data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +11 -40
- data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +13 -15
- data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +1 -1
- data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1749 -399
- data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +26 -23
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +1 -83
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +9 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +27 -4
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +59 -37
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +11 -3
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +52 -12
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +2 -1
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +14 -30
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +39 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +39 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +127 -32
- data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3023 -4425
- data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +48 -13
- data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +10 -9
- data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
- data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
- data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +168 -50
- data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +0 -4
- data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +5 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +69 -5
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +4 -1
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +27 -6
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +38 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +132 -2
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +2 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +345 -87
- data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +13 -0
- data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
- data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +4060 -357
- data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +198 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +71 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +74 -6
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q8_0_f32.cl +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
- data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
- data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
- data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
- data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
- data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +733 -130
- data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +57 -3
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
- data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +307 -59
- data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +66 -0
- data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
- data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +134 -38
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
- data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -23
- data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -5
- data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
- data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +43 -40
- data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
- data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +548 -3
- data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +28 -26
- data/ext/sources/ggml/src/ggml-openvino/utils.cpp +383 -94
- data/ext/sources/ggml/src/ggml-openvino/utils.h +11 -8
- data/ext/sources/ggml/src/ggml-quants.c +76 -0
- data/ext/sources/ggml/src/ggml-quants.h +3 -0
- data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +5 -5
- data/ext/sources/ggml/src/ggml-sycl/backend.hpp +2 -0
- data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
- data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
- data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/common.cpp +6 -8
- data/ext/sources/ggml/src/ggml-sycl/common.hpp +19 -2
- data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
- data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
- data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
- data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
- data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/convert.cpp +6 -0
- data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
- data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
- data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
- data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
- data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +15 -0
- data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +492 -319
- data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
- data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -115
- data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -0
- data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1006 -336
- data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +252 -67
- data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +17 -0
- data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
- data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
- data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
- data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
- data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
- data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +10 -2
- data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
- data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +35 -0
- data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +5 -0
- data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +833 -215
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +1 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +1 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +23 -4
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +14 -18
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +21 -24
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +31 -23
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +6 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +84 -67
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +121 -74
- data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +26 -19
- data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +31 -36
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +16 -2
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +7 -7
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +21 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +439 -320
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +2 -2
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +45 -39
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +586 -465
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +63 -69
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +14 -9
- data/ext/sources/ggml/src/ggml.c +36 -14
- data/ext/sources/include/whisper.h +21 -0
- data/ext/sources/src/whisper.cpp +164 -14
- data/lib/whisper/log_settable.rb +5 -8
- data/lib/whisper/model/uri.rb +0 -7
- data/sig/whisper.rbs +6 -0
- data/test/test_vad.rb +9 -0
- data/test/test_vad_context.rb +2 -2
- data/whispercpp.gemspec +1 -1
- metadata +62 -37
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-flash-attn-ops.c +0 -1878
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c +0 -2066
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.c +0 -6
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.h +0 -88
- data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-profile.h +0 -34
- data/ext/sources/ggml/src/ggml-hexagon/htp/vtcm-utils.h +0 -16
- data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_gelu.cpp +0 -25
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/xielu.comp +0 -35
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include "ggml-
|
|
3
|
+
#include "ggml-backend-impl.h"
|
|
4
|
+
#include "ggml-backend.h"
|
|
4
5
|
#include "ggml.h"
|
|
5
6
|
#include "openvino/decoder.h"
|
|
6
7
|
|
|
@@ -14,21 +15,21 @@
|
|
|
14
15
|
|
|
15
16
|
struct ModelParams {
|
|
16
17
|
int ctx = -1;
|
|
17
|
-
int ctx_swa = -1;
|
|
18
18
|
int ctx_per_seq = -1;
|
|
19
19
|
int ctx_per_seq_swa = -1;
|
|
20
20
|
int n_seq = 1;
|
|
21
|
-
int n_heads = -1;
|
|
22
21
|
int n_heads_kv = -1;
|
|
23
22
|
int head_size = -1;
|
|
24
23
|
int32_t rope_params[15];
|
|
24
|
+
bool mixed_rope_params = false;
|
|
25
25
|
std::vector<int> swa_layers;
|
|
26
26
|
|
|
27
27
|
std::vector<std::string> kv_names;
|
|
28
28
|
size_t kv_buffer_ctx_id = 0;
|
|
29
29
|
|
|
30
30
|
bool same_rope_params(const ModelParams & other) const {
|
|
31
|
-
return
|
|
31
|
+
return mixed_rope_params == other.mixed_rope_params &&
|
|
32
|
+
memcmp(rope_params, other.rope_params, sizeof(int32_t) * 15) == 0;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
bool can_reuse_dynamically(const ModelParams & other) const { return same_rope_params(other); }
|
|
@@ -56,12 +57,14 @@ public:
|
|
|
56
57
|
std::string node_name;
|
|
57
58
|
std::string node_op_type;
|
|
58
59
|
std::map<std::string, ggml_tensor *> node_inputs;
|
|
60
|
+
std::map<std::string, std::vector<std::pair<std::string, ggml_tensor *>>> node_inputs_views;
|
|
59
61
|
std::vector<std::string> node_inputs_names;
|
|
60
62
|
ggml_tensor * node_output;
|
|
61
63
|
std::string node_output_name;
|
|
62
64
|
int node_op_case = 0;
|
|
63
65
|
void * data_addr;
|
|
64
66
|
};
|
|
67
|
+
|
|
65
68
|
// Graph decoder
|
|
66
69
|
GgmlOvDecoder(ggml_cgraph * cgraph,
|
|
67
70
|
ModelParams & model_params,
|
|
@@ -69,6 +72,7 @@ public:
|
|
|
69
72
|
std::map<std::string, std::shared_ptr<ov::Node>> & model_weights,
|
|
70
73
|
bool is_static,
|
|
71
74
|
bool is_stateful = false,
|
|
75
|
+
bool model_is_splitted = false,
|
|
72
76
|
bool is_prefill = false,
|
|
73
77
|
int prefill_chunk_size = 256);
|
|
74
78
|
|
|
@@ -84,6 +88,42 @@ public:
|
|
|
84
88
|
|
|
85
89
|
virtual std::vector<size_t> get_input_stride(int node_idx, const std::string & name) const override;
|
|
86
90
|
|
|
91
|
+
virtual size_t get_view_input_size(int node_idx, const std::string & name) const override;
|
|
92
|
+
|
|
93
|
+
virtual size_t get_view_input_offset(int node_idx, const std::string & name, size_t view_index) const override;
|
|
94
|
+
|
|
95
|
+
virtual size_t get_view_input_src_offset(int node_idx, const std::string & name, size_t view_index) const override;
|
|
96
|
+
|
|
97
|
+
virtual std::vector<size_t> get_view_input_stride(int node_idx,
|
|
98
|
+
const std::string & name,
|
|
99
|
+
size_t view_index) const override;
|
|
100
|
+
|
|
101
|
+
virtual std::vector<size_t> get_view_input_src_stride(int node_idx,
|
|
102
|
+
const std::string & name,
|
|
103
|
+
size_t view_index) const override;
|
|
104
|
+
|
|
105
|
+
virtual ov::Shape get_view_input_ggml_shape(int node_idx,
|
|
106
|
+
const std::string & name,
|
|
107
|
+
size_t view_index) const override;
|
|
108
|
+
|
|
109
|
+
virtual ov::Shape get_view_input_src_ggml_shape(int node_idx,
|
|
110
|
+
const std::string & name,
|
|
111
|
+
size_t view_index) const override;
|
|
112
|
+
|
|
113
|
+
virtual ov::PartialShape get_view_input_ov_shape(int node_idx,
|
|
114
|
+
const std::string & name,
|
|
115
|
+
size_t view_index) const override;
|
|
116
|
+
|
|
117
|
+
virtual ov::PartialShape get_view_input_src_ov_shape(int node_idx,
|
|
118
|
+
const std::string & name,
|
|
119
|
+
size_t view_index) const override;
|
|
120
|
+
|
|
121
|
+
virtual std::string get_view_input_name(int node_idx, const std::string & name, size_t view_index) const override;
|
|
122
|
+
|
|
123
|
+
virtual std::string get_view_input_src_name(int node_idx,
|
|
124
|
+
const std::string & name,
|
|
125
|
+
size_t view_index) const override;
|
|
126
|
+
|
|
87
127
|
virtual ov::element::Type get_input_type(int node_idx, const std::string & name) const override;
|
|
88
128
|
|
|
89
129
|
virtual size_t get_input_size() const override;
|
|
@@ -106,10 +146,14 @@ public:
|
|
|
106
146
|
|
|
107
147
|
virtual ov::element::Type get_output_type(int node_idx) const override;
|
|
108
148
|
|
|
149
|
+
virtual std::vector<size_t> get_output_stride(int node_idx) const override;
|
|
150
|
+
|
|
109
151
|
virtual int32_t * get_input_op_params(int node_idx, const std::string & name) const override;
|
|
110
152
|
|
|
111
153
|
virtual int32_t * get_output_op_params(int node_idx) const override;
|
|
112
154
|
|
|
155
|
+
virtual size_t get_output_op_offset(int node_idx) const override;
|
|
156
|
+
|
|
113
157
|
virtual std::vector<std::string> get_output_names(int node_idx) const override;
|
|
114
158
|
|
|
115
159
|
virtual const std::string & get_op_type() const override;
|
|
@@ -120,7 +164,10 @@ public:
|
|
|
120
164
|
|
|
121
165
|
virtual const std::string & get_op_name(int node_idx) const override;
|
|
122
166
|
|
|
123
|
-
virtual
|
|
167
|
+
virtual int32_t get_op_dynamic_dim(int node_idx) const override;
|
|
168
|
+
|
|
169
|
+
virtual void visit_subgraph(
|
|
170
|
+
std::function<void(std::shared_ptr<GgmlDecoder>, int node_idx)> node_visitor) const override;
|
|
124
171
|
|
|
125
172
|
ggml_tensor * get_input_ggml_tensor(const std::string & name) const { return m_inputs.at(name); }
|
|
126
173
|
|
|
@@ -142,16 +189,12 @@ public:
|
|
|
142
189
|
return m_model_weights;
|
|
143
190
|
}
|
|
144
191
|
|
|
145
|
-
virtual std::vector<std::string> get_model_output_names() const override {
|
|
146
|
-
return m_model_output_names;
|
|
147
|
-
}
|
|
192
|
+
virtual std::vector<std::string> get_model_output_names() const override { return m_model_output_names; }
|
|
148
193
|
|
|
149
194
|
const std::map<std::string, ggml_tensor *> & get_model_outputs() const { return m_model_outputs; }
|
|
150
195
|
|
|
151
196
|
virtual int get_ctx_size() const { return m_model_params.ctx; }
|
|
152
197
|
|
|
153
|
-
virtual int get_ctx_swa_size() const { return m_model_params.ctx_swa; }
|
|
154
|
-
|
|
155
198
|
virtual int get_ctx_per_seq() const { return m_model_params.ctx_per_seq; }
|
|
156
199
|
|
|
157
200
|
virtual int get_ctx_per_seq_swa() const { return m_model_params.ctx_per_seq_swa; }
|
|
@@ -169,13 +212,21 @@ public:
|
|
|
169
212
|
|
|
170
213
|
virtual int32_t * get_rope_params() const override { return const_cast<int32_t *>(m_model_params.rope_params); }
|
|
171
214
|
|
|
215
|
+
virtual bool has_mixed_rope_params() const override { return m_model_params.mixed_rope_params; }
|
|
216
|
+
|
|
172
217
|
virtual std::map<std::string, std::string> get_kv_param_res_names() const override;
|
|
173
218
|
|
|
174
219
|
virtual bool is_static() const override { return m_is_static; }
|
|
175
220
|
|
|
176
221
|
virtual bool is_stateful() const override { return m_is_stateful; }
|
|
177
222
|
|
|
178
|
-
|
|
223
|
+
int get_static_n_tokens() const { return m_is_prefill ? m_prefill_chunk_size : 1; }
|
|
224
|
+
|
|
225
|
+
virtual bool is_splited_model() const override { return m_model_is_splitted; }
|
|
226
|
+
|
|
227
|
+
ov::PartialShape get_graph_input_shape(const ggml_tensor * op,
|
|
228
|
+
const ggml_tensor * input,
|
|
229
|
+
int dynamic_dim_index = -1) const;
|
|
179
230
|
|
|
180
231
|
static void dump_cgraph(const ggml_cgraph * cgraph, std::string & filename);
|
|
181
232
|
|
|
@@ -205,6 +256,7 @@ public:
|
|
|
205
256
|
bool m_is_prefill = false;
|
|
206
257
|
bool m_naive = false;
|
|
207
258
|
int m_prefill_chunk_size = 0;
|
|
259
|
+
bool m_model_is_splitted = false; // label the cgraph is splited or not
|
|
208
260
|
|
|
209
261
|
static ov::Shape get_shape(const ggml_tensor * tensor);
|
|
210
262
|
static std::vector<size_t> get_stride(const ggml_tensor * tensor);
|
|
@@ -227,7 +279,8 @@ public:
|
|
|
227
279
|
}
|
|
228
280
|
|
|
229
281
|
inline static bool is_inp_mask(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
230
|
-
return op->op == GGML_OP_CPY || (op->op == GGML_OP_FLASH_ATTN_EXT && tensor == op->src[3])
|
|
282
|
+
return op->op == GGML_OP_CPY || (op->op == GGML_OP_FLASH_ATTN_EXT && tensor == op->src[3]) ||
|
|
283
|
+
(op->op == GGML_OP_SOFT_MAX && tensor == op->src[1]);
|
|
231
284
|
}
|
|
232
285
|
|
|
233
286
|
inline static bool is_rope_freqs_weight(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
@@ -235,7 +288,8 @@ public:
|
|
|
235
288
|
}
|
|
236
289
|
|
|
237
290
|
inline static bool is_kvcache(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
238
|
-
return
|
|
291
|
+
return tensor->buffer->usage == GGML_BACKEND_BUFFER_USAGE_ANY ||
|
|
292
|
+
(op != nullptr && op->op == GGML_OP_SET_ROWS && op->src[2] == tensor);
|
|
239
293
|
}
|
|
240
294
|
|
|
241
295
|
inline static bool is_kv_idx(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
@@ -243,23 +297,18 @@ public:
|
|
|
243
297
|
}
|
|
244
298
|
|
|
245
299
|
inline static bool is_output_idx(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
246
|
-
return op->op == GGML_OP_GET_ROWS && tensor == op->src[1] && op->src[0]->op != GGML_OP_NONE
|
|
300
|
+
return op->op == GGML_OP_GET_ROWS && tensor == op->src[1] && op->src[0]->op != GGML_OP_NONE &&
|
|
301
|
+
op->src[1]->op == GGML_OP_NONE;
|
|
247
302
|
}
|
|
248
303
|
|
|
249
|
-
|
|
250
|
-
if (is_inp_tok(tensor, op)) {
|
|
251
|
-
return "inp_tokens";
|
|
252
|
-
}
|
|
304
|
+
std::string get_graph_input_ov_name(const ggml_tensor * tensor, const ggml_tensor * op) {
|
|
253
305
|
if (is_inp_pos(tensor, op)) {
|
|
254
306
|
return "inp_pos";
|
|
255
307
|
}
|
|
256
308
|
if (is_inp_emb(tensor, op)) {
|
|
257
309
|
return "embd";
|
|
258
310
|
}
|
|
259
|
-
if (
|
|
260
|
-
return "inp_out_ids";
|
|
261
|
-
}
|
|
262
|
-
if (is_inp_mask(tensor, op)) {
|
|
311
|
+
if (is_stateful() && is_inp_mask(tensor, op)) {
|
|
263
312
|
return std::string(tensor->name).find("swa") == std::string::npos ? "self_kq_mask" : "self_kq_mask_swa";
|
|
264
313
|
}
|
|
265
314
|
return tensor->name;
|
|
@@ -272,6 +321,9 @@ private:
|
|
|
272
321
|
void compute_model_inputs();
|
|
273
322
|
void compute_model_outputs();
|
|
274
323
|
|
|
324
|
+
// Infer and propagate dynamic-dimension indices for all tensors in the GGML graph.
|
|
325
|
+
void compute_node_dynamic_dims();
|
|
326
|
+
|
|
275
327
|
void validate_cgraph() const;
|
|
276
328
|
|
|
277
329
|
ggml_cgraph * m_cgraph = nullptr;
|
|
@@ -284,6 +336,7 @@ private:
|
|
|
284
336
|
std::map<std::string, ggml_tensor *> m_model_outputs;
|
|
285
337
|
std::vector<std::string> m_model_output_names;
|
|
286
338
|
std::vector<NodeInfo> m_node_info_list;
|
|
339
|
+
std::map<ggml_tensor *, int> m_node_dynamic_dims;
|
|
287
340
|
|
|
288
341
|
ModelParams m_model_params;
|
|
289
342
|
ComputeParams m_compute_params;
|
|
@@ -291,4 +344,4 @@ private:
|
|
|
291
344
|
|
|
292
345
|
void print_tensor_address_map(const ggml_cgraph * cgraph);
|
|
293
346
|
|
|
294
|
-
int extract_layer_from_name(const std::string & name);
|
|
347
|
+
std::optional<int> extract_layer_from_name(const std::string & name);
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
#include "ggml-impl.h"
|
|
4
4
|
#include "ggml.h"
|
|
5
5
|
|
|
6
|
+
#include <cstdlib>
|
|
6
7
|
#include <cstring>
|
|
7
8
|
#include <openvino/runtime/intel_gpu/ocl/ocl.hpp>
|
|
8
9
|
#include <openvino/runtime/intel_npu/level_zero/level_zero.hpp>
|
|
@@ -22,7 +23,38 @@ void ggml_openvino_device_config::init() {
|
|
|
22
23
|
if (initialized) {
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
+
|
|
27
|
+
// All recognized GGML_OPENVINO_* env vars. Their values are cached here
|
|
28
|
+
// once at backend init time and read back via ggml_openvino_getenv_str()
|
|
29
|
+
// (raw string) or ggml_openvino_getenv_int() (integer / boolean toggle).
|
|
30
|
+
static constexpr const char * env_var_names[] = {
|
|
31
|
+
// String values (use ggml_openvino_getenv_str)
|
|
32
|
+
"GGML_OPENVINO_DEVICE",
|
|
33
|
+
"GGML_OPENVINO_CACHE_DIR",
|
|
34
|
+
// Integer values (use ggml_openvino_getenv_int)
|
|
35
|
+
"GGML_OPENVINO_PREFILL_CHUNK_SIZE",
|
|
36
|
+
// Boolean toggles (treated as int flags via ggml_openvino_getenv_int)
|
|
37
|
+
"GGML_OPENVINO_STATEFUL_EXECUTION",
|
|
38
|
+
"GGML_OPENVINO_PROFILING",
|
|
39
|
+
"GGML_OPENVINO_DUMP_CGRAPH",
|
|
40
|
+
"GGML_OPENVINO_DUMP_IR",
|
|
41
|
+
"GGML_OPENVINO_DEBUG_INPUT",
|
|
42
|
+
"GGML_OPENVINO_DEBUG_OUTPUT",
|
|
43
|
+
"GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS",
|
|
44
|
+
"GGML_OPENVINO_ENABLE_CACHE",
|
|
45
|
+
"GGML_OPENVINO_DISABLE_CACHE",
|
|
46
|
+
"GGML_OPENVINO_DISABLE_KV_SLICE",
|
|
47
|
+
"GGML_OPENVINO_MANUAL_GQA_ATTN",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
for (const char * const & env_var : env_var_names) {
|
|
51
|
+
auto * env = getenv(env_var);
|
|
52
|
+
if (env) {
|
|
53
|
+
environment_variables[env_var] = env;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
device_name = ggml_openvino_getenv_str("GGML_OPENVINO_DEVICE", "CPU");
|
|
26
58
|
auto available_devices = ov_singleton_core().get_available_devices();
|
|
27
59
|
if (std::find(available_devices.begin(), available_devices.end(), device_name) == available_devices.end()) {
|
|
28
60
|
GGML_LOG_WARN("GGML OpenVINO Backend: device %s is not available, fallback to CPU\n", device_name.c_str());
|
|
@@ -30,7 +62,7 @@ void ggml_openvino_device_config::init() {
|
|
|
30
62
|
}
|
|
31
63
|
is_npu = (device_name == "NPU");
|
|
32
64
|
|
|
33
|
-
|
|
65
|
+
const char * cache_dir = ggml_openvino_getenv_str("GGML_OPENVINO_CACHE_DIR");
|
|
34
66
|
if (device_name == "NPU") {
|
|
35
67
|
compile_config = {
|
|
36
68
|
{"NPU_COMPILER_DYNAMIC_QUANTIZATION", "YES" },
|
|
@@ -119,6 +151,23 @@ const std::string & ggml_openvino_get_device_name() {
|
|
|
119
151
|
return ggml_openvino_get_device_config().device_name;
|
|
120
152
|
}
|
|
121
153
|
|
|
154
|
+
// Get the value of a GGML_OPENVINO_* env var as a string. Returns
|
|
155
|
+
// default_value when the var is unset or set to an empty string.
|
|
156
|
+
const char * ggml_openvino_getenv_str(const char * var, const char * default_value) {
|
|
157
|
+
auto & env_map = ggml_openvino_get_device_config().environment_variables;
|
|
158
|
+
auto it = env_map.find(var);
|
|
159
|
+
return (it == env_map.end() || it->second.empty()) ? default_value : it->second.c_str();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Get the value of a GGML_OPENVINO_* env var as an int (via std::atoi).
|
|
163
|
+
// Returns default_value (0) when the var is unset or empty. Used for both
|
|
164
|
+
// integer settings (e.g. GGML_OPENVINO_PREFILL_CHUNK_SIZE) and boolean
|
|
165
|
+
// toggles: "0" disables, any non-zero integer enables.
|
|
166
|
+
int ggml_openvino_getenv_int(const char * var, int default_value) {
|
|
167
|
+
const char * v = ggml_openvino_getenv_str(var, nullptr);
|
|
168
|
+
return v ? std::atoi(v) : default_value;
|
|
169
|
+
}
|
|
170
|
+
|
|
122
171
|
// Check if running on NPU
|
|
123
172
|
bool ggml_openvino_is_npu() {
|
|
124
173
|
return ggml_openvino_get_device_config().is_npu;
|
|
@@ -173,7 +222,8 @@ std::optional<ExtraQuantType> ggml_openvino_get_requant_type(const ggml_tensor *
|
|
|
173
222
|
return std::nullopt;
|
|
174
223
|
}
|
|
175
224
|
if (strncmp(tensor->name, "token_embd.weight", 17) == 0) {
|
|
176
|
-
return ((ggml_openvino_is_npu() && tensor->type == GGML_TYPE_Q6_K) ? ExtraQuantType::F16 :
|
|
225
|
+
return ((ggml_openvino_is_npu() && tensor->type == GGML_TYPE_Q6_K) ? ExtraQuantType::F16 :
|
|
226
|
+
ExtraQuantType::Q8_0_C);
|
|
177
227
|
}
|
|
178
228
|
if (strncmp(tensor->name, "output.weight", 13) == 0) {
|
|
179
229
|
return ExtraQuantType::Q8_0_C;
|
|
@@ -298,6 +348,10 @@ ggml_openvino_extracted_layout ggml_openvino_get_extracted_layout(const ggml_ten
|
|
|
298
348
|
layout.is_symmetric = true;
|
|
299
349
|
break;
|
|
300
350
|
|
|
351
|
+
case GGML_TYPE_Q5_1:
|
|
352
|
+
// u8 weights (5-bit values), asymmetric (scale + zero point)
|
|
353
|
+
break;
|
|
354
|
+
|
|
301
355
|
case GGML_TYPE_Q6_K:
|
|
302
356
|
layout.weights_per_block = 16;
|
|
303
357
|
layout.is_symmetric = true;
|
|
@@ -64,6 +64,7 @@ struct ggml_openvino_device_config {
|
|
|
64
64
|
bool initialized = false;
|
|
65
65
|
std::optional<ov::RemoteContext> remote_context;
|
|
66
66
|
ov::AnyMap compile_config;
|
|
67
|
+
std::unordered_map<std::string, std::string> environment_variables;
|
|
67
68
|
cl_command_queue cl_queue = nullptr;
|
|
68
69
|
|
|
69
70
|
void init();
|
|
@@ -79,6 +80,22 @@ void ggml_openvino_init_device_config();
|
|
|
79
80
|
// Get the device name
|
|
80
81
|
const std::string & ggml_openvino_get_device_name();
|
|
81
82
|
|
|
83
|
+
// Environment variable accessors. All GGML_OPENVINO_* env vars are read once
|
|
84
|
+
// during backend init and cached on the device config; consumers must go
|
|
85
|
+
// through these helpers (never call ::getenv directly) so behavior stays
|
|
86
|
+
// consistent and centralized.
|
|
87
|
+
//
|
|
88
|
+
// Use ggml_openvino_getenv_str() for string / path values
|
|
89
|
+
// (e.g. GGML_OPENVINO_DEVICE, GGML_OPENVINO_CACHE_DIR). The optional
|
|
90
|
+
// default_value is returned when the var is unset or empty.
|
|
91
|
+
//
|
|
92
|
+
// Use ggml_openvino_getenv_int() for boolean toggles and integer settings.
|
|
93
|
+
// It returns std::atoi(value) when set, otherwise default_value. For
|
|
94
|
+
// boolean use, `if (ggml_openvino_getenv_int(name))` is true iff the value
|
|
95
|
+
// is a non-zero integer (so "0" disables, "1" enables).
|
|
96
|
+
const char * ggml_openvino_getenv_str(const char * var, const char * default_value = nullptr);
|
|
97
|
+
int ggml_openvino_getenv_int(const char * var, int default_value = 0);
|
|
98
|
+
|
|
82
99
|
// Check if running on NPU
|
|
83
100
|
bool ggml_openvino_is_npu();
|
|
84
101
|
|
|
@@ -115,9 +132,9 @@ struct ggml_openvino_weight_extra : public ggml_openvino_extra_base {
|
|
|
115
132
|
|
|
116
133
|
// Extra data for quantized weight tensors - stores extracted weights/scales/zp and weight node
|
|
117
134
|
struct ggml_openvino_quantized_weight_extra : public ggml_openvino_extra_base {
|
|
118
|
-
ov::Tensor weights;
|
|
119
|
-
ov::Tensor scales;
|
|
120
|
-
ov::Tensor zp;
|
|
135
|
+
ov::Tensor weights; // U4 or U8 extracted weights
|
|
136
|
+
ov::Tensor scales; // F16 scales
|
|
137
|
+
ov::Tensor zp; // U4 or U8 zero points (same type as weights)
|
|
121
138
|
std::shared_ptr<ov::Node> weight_node; // Pre-built OpenVINO weight subgraph
|
|
122
139
|
|
|
123
140
|
ggml_openvino_quantized_weight_extra(ov::Tensor w, ov::Tensor s, ov::Tensor z, std::shared_ptr<ov::Node> n) :
|
|
@@ -132,8 +149,9 @@ struct ggml_openvino_quantized_weight_extra : public ggml_openvino_extra_base {
|
|
|
132
149
|
struct ggml_openvino_tensor_extra : public ggml_openvino_extra_base {
|
|
133
150
|
std::shared_ptr<ov::Tensor> tensor; // For direct use with infer_request
|
|
134
151
|
|
|
135
|
-
explicit ggml_openvino_tensor_extra(std::shared_ptr<ov::Tensor> t)
|
|
136
|
-
|
|
152
|
+
explicit ggml_openvino_tensor_extra(std::shared_ptr<ov::Tensor> t) :
|
|
153
|
+
ggml_openvino_extra_base(Type::TENSOR),
|
|
154
|
+
tensor(std::move(t)) {}
|
|
137
155
|
};
|
|
138
156
|
|
|
139
157
|
// =====================================================
|
|
@@ -152,11 +170,11 @@ struct ggml_openvino_extracted_layout {
|
|
|
152
170
|
size_t zp_size = 0; // Size of zero points in bytes (U4 or U8)
|
|
153
171
|
bool is_u4; // true for U4 weights, false for U8
|
|
154
172
|
int64_t weights_per_block; // weights per scale/zp block
|
|
155
|
-
bool is_symmetric;
|
|
173
|
+
bool is_symmetric; // true for symmetric quantization
|
|
156
174
|
|
|
157
175
|
// Requantization info
|
|
158
|
-
bool is_requant = false;
|
|
159
|
-
std::optional<ExtraQuantType> requant_type;
|
|
176
|
+
bool is_requant = false; // true if this tensor needs requantization
|
|
177
|
+
std::optional<ExtraQuantType> requant_type; // target requant type if is_requant
|
|
160
178
|
};
|
|
161
179
|
|
|
162
180
|
// Calculate the buffer layout for extracted quantized data
|
|
@@ -164,6 +182,9 @@ ggml_openvino_extracted_layout ggml_openvino_get_extracted_layout(const ggml_ten
|
|
|
164
182
|
|
|
165
183
|
ggml_openvino_tensor_extra * ggml_openvino_create_tensor_extra(const ggml_tensor * tensor, bool is_remote);
|
|
166
184
|
|
|
185
|
+
// Check if a tensor's buffer uses remote (device) memory (e.g. GPU USM)
|
|
186
|
+
bool ggml_openvino_buffer_is_remote(const ggml_tensor * tensor);
|
|
187
|
+
|
|
167
188
|
// Register an extra with the tensor's OpenVINO buffer context for proper lifetime management.
|
|
168
189
|
// This sets tensor->extra and tracks the extra in the buffer context for cleanup.
|
|
169
190
|
void ggml_openvino_buffer_register_extra(ggml_tensor * tensor, ggml_openvino_extra_base * extra);
|