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
|
@@ -30,17 +30,16 @@ OutputVector translate_mulmat(const NodeContext & context) {
|
|
|
30
30
|
int op_case = context.get_op_case();
|
|
31
31
|
|
|
32
32
|
ov::Output<Node> res;
|
|
33
|
-
ov::Output<ov::Node> B
|
|
34
|
-
ov::Output<ov::Node> A
|
|
35
|
-
|
|
36
|
-
bool transpose_b = true;
|
|
37
|
-
if (op_case == 2) {
|
|
38
|
-
B = B.get_node_shared_ptr()->input_value(0);
|
|
39
|
-
transpose_b = false;
|
|
40
|
-
} else if (op_case == 3) {
|
|
33
|
+
ov::Output<ov::Node> B;
|
|
34
|
+
ov::Output<ov::Node> A;
|
|
35
|
+
if (op_case == 3) {
|
|
41
36
|
B = process_view_input(context, 0);
|
|
42
37
|
A = process_view_input(context, 1);
|
|
38
|
+
} else {
|
|
39
|
+
B = process_view_input_new(context, 0);
|
|
40
|
+
A = process_view_input_new(context, 1);
|
|
43
41
|
}
|
|
42
|
+
|
|
44
43
|
if (A.get_element_type() != B.get_element_type()) {
|
|
45
44
|
B = std::make_shared<ov::op::v0::Convert>(context.get_input(0), context.get_input_type(1));
|
|
46
45
|
}
|
|
@@ -55,6 +54,7 @@ OutputVector translate_mulmat(const NodeContext & context) {
|
|
|
55
54
|
auto batch_small = A_batch_larger ? B_batch : A_batch;
|
|
56
55
|
|
|
57
56
|
Output<Node> Z = A_batch_larger ? B : A;
|
|
57
|
+
auto Z_shape = A_batch_larger ? B_shape : A_shape;
|
|
58
58
|
int64_t factor = batch_large / batch_small;
|
|
59
59
|
if (factor > 1 && batch_small > 1) {
|
|
60
60
|
auto batch_large_node = ov::op::v0::Constant::create(ov::element::i64, {1}, std::vector<int64_t>{batch_large});
|
|
@@ -67,7 +67,11 @@ OutputVector translate_mulmat(const NodeContext & context) {
|
|
|
67
67
|
auto broadcast_shape = ov::op::v0::Constant::create(
|
|
68
68
|
ov::element::i64, {5}, {(int64_t) 1, (int64_t) 1, factor, (int64_t) 1, (int64_t) 1});
|
|
69
69
|
auto new_Z_shape = ov::op::v0::Constant::create(ov::element::i64, {4},
|
|
70
|
-
{(int64_t) 0, batch_large, (int64_t) -1, (int64_t)
|
|
70
|
+
{(int64_t) 0, batch_large, (int64_t) -1, (int64_t) Z_shape[3]});
|
|
71
|
+
if (op_case == 2) {
|
|
72
|
+
new_Z_shape = ov::op::v0::Constant::create(ov::element::i64, {4},
|
|
73
|
+
{(int64_t) 0, batch_large, (int64_t) Z_shape[2], (int64_t) -1});
|
|
74
|
+
}
|
|
71
75
|
|
|
72
76
|
auto Z_broadcasted = std::make_shared<ov::op::v3::Broadcast>(Z_unsqueezed, broadcast_shape,
|
|
73
77
|
ov::op::BroadcastType::BIDIRECTIONAL);
|
|
@@ -79,8 +83,14 @@ OutputVector translate_mulmat(const NodeContext & context) {
|
|
|
79
83
|
A = Z;
|
|
80
84
|
}
|
|
81
85
|
|
|
86
|
+
bool transpose_b = true;
|
|
82
87
|
res = std::make_shared<ov::op::v0::MatMul>(A, B, false, transpose_b);
|
|
83
88
|
|
|
89
|
+
const auto output_type = context.get_output_type();
|
|
90
|
+
if (res.get_element_type() != output_type) {
|
|
91
|
+
res = std::make_shared<ov::op::v0::Convert>(res, output_type);
|
|
92
|
+
}
|
|
93
|
+
|
|
84
94
|
return rename_outputs_with_suffix({res}, context.get_name());
|
|
85
95
|
}
|
|
86
96
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#include "../node_context.h"
|
|
2
|
+
#include "../op_table.h"
|
|
3
|
+
#include "../utils.h"
|
|
4
|
+
|
|
5
|
+
#include <memory>
|
|
6
|
+
#include <openvino/op/add.hpp>
|
|
7
|
+
#include <openvino/op/constant.hpp>
|
|
8
|
+
#include <openvino/op/divide.hpp>
|
|
9
|
+
#include <openvino/op/multiply.hpp>
|
|
10
|
+
#include <openvino/op/power.hpp>
|
|
11
|
+
#include <openvino/op/reduce_mean.hpp>
|
|
12
|
+
#include <openvino/op/sqrt.hpp>
|
|
13
|
+
#include <openvino/op/subtract.hpp>
|
|
14
|
+
|
|
15
|
+
namespace ov {
|
|
16
|
+
namespace frontend {
|
|
17
|
+
namespace ggml {
|
|
18
|
+
namespace op {
|
|
19
|
+
|
|
20
|
+
OutputVector translate_norm(const NodeContext & context) {
|
|
21
|
+
num_inputs_check(context, 1, 1);
|
|
22
|
+
|
|
23
|
+
auto input_node = process_view_input_new(context, 0);
|
|
24
|
+
|
|
25
|
+
// Step 1: Calculate mean along the last dimension
|
|
26
|
+
// mean = reduce_mean(input, axis=-1, keepdims=true)
|
|
27
|
+
auto mean = std::make_shared<ov::op::v1::ReduceMean>(
|
|
28
|
+
input_node, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {-1}), true);
|
|
29
|
+
|
|
30
|
+
// Step 2: Calculate (input - mean)
|
|
31
|
+
auto centered = std::make_shared<ov::op::v1::Subtract>(input_node, mean);
|
|
32
|
+
|
|
33
|
+
// Step 3: Calculate squared differences (input - mean)^2
|
|
34
|
+
auto squared = std::make_shared<ov::op::v1::Power>(
|
|
35
|
+
centered, ov::op::v0::Constant::create(ov::element::f32, ov::Shape{1}, {2.0f}));
|
|
36
|
+
|
|
37
|
+
// Step 4: Calculate variance = mean((input - mean)^2)
|
|
38
|
+
auto variance = std::make_shared<ov::op::v1::ReduceMean>(
|
|
39
|
+
squared, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {-1}), true);
|
|
40
|
+
|
|
41
|
+
// Step 5: Get epsilon from op_params
|
|
42
|
+
float eps;
|
|
43
|
+
memcpy(&eps, context.get_output_op_params(), sizeof(float));
|
|
44
|
+
|
|
45
|
+
// Step 6: Calculate std = sqrt(variance + eps)
|
|
46
|
+
auto std_dev = std::make_shared<ov::op::v0::Sqrt>(std::make_shared<ov::op::v1::Add>(
|
|
47
|
+
variance, ov::op::v0::Constant::create(ov::element::f32, ov::Shape{1}, {eps})));
|
|
48
|
+
|
|
49
|
+
// Step 7: Normalize: output = (input - mean) / std
|
|
50
|
+
auto res = std::make_shared<ov::op::v1::Divide>(centered, std_dev);
|
|
51
|
+
|
|
52
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
} // namespace op
|
|
56
|
+
} // namespace ggml
|
|
57
|
+
} // namespace frontend
|
|
58
|
+
} // namespace ov
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#include "../op_table.h"
|
|
2
|
+
#include "../utils.h"
|
|
3
|
+
|
|
4
|
+
#include <array>
|
|
5
|
+
#include <cstdint>
|
|
6
|
+
#include <openvino/op/constant.hpp>
|
|
7
|
+
#include <openvino/op/gather.hpp>
|
|
8
|
+
#include <openvino/op/pad.hpp>
|
|
9
|
+
#include <openvino/op/reshape.hpp>
|
|
10
|
+
#include <openvino/op/shape_of.hpp>
|
|
11
|
+
#include <vector>
|
|
12
|
+
|
|
13
|
+
namespace ov {
|
|
14
|
+
namespace frontend {
|
|
15
|
+
namespace ggml {
|
|
16
|
+
namespace op {
|
|
17
|
+
|
|
18
|
+
namespace {
|
|
19
|
+
|
|
20
|
+
ov::Output<ov::Node> translate_circular_pad(ov::Output<ov::Node> input,
|
|
21
|
+
const std::array<int32_t, 8> & pads,
|
|
22
|
+
const ov::Shape & input_shape) {
|
|
23
|
+
ov::Output<ov::Node> result = input;
|
|
24
|
+
|
|
25
|
+
const std::array<int32_t, 4> pads_begin = {pads[6], pads[4], pads[2], pads[0]};
|
|
26
|
+
const std::array<int32_t, 4> pads_end = {pads[7], pads[5], pads[3], pads[1]};
|
|
27
|
+
|
|
28
|
+
for (size_t axis = 0; axis < input_shape.size(); ++axis) {
|
|
29
|
+
const int64_t input_dim = static_cast<int64_t>(input_shape[axis]);
|
|
30
|
+
const int64_t pad_begin = pads_begin[axis];
|
|
31
|
+
const int64_t pad_end = pads_end[axis];
|
|
32
|
+
|
|
33
|
+
if (pad_begin == 0 && pad_end == 0) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
FRONT_END_CHECK_IMPLEMENTED(input_dim > 0, "Circular PAD requires static non-zero input dimensions");
|
|
38
|
+
|
|
39
|
+
std::vector<int64_t> indices(static_cast<size_t>(input_dim + pad_begin + pad_end));
|
|
40
|
+
for (int64_t index = 0; index < static_cast<int64_t>(indices.size()); ++index) {
|
|
41
|
+
int64_t wrapped = (index - pad_begin) % input_dim;
|
|
42
|
+
if (wrapped < 0) {
|
|
43
|
+
wrapped += input_dim;
|
|
44
|
+
}
|
|
45
|
+
indices[static_cast<size_t>(index)] = wrapped;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
auto gather_indices = ov::op::v0::Constant::create(ov::element::i64, {indices.size()}, indices);
|
|
49
|
+
auto gather_axis = ov::op::v0::Constant::create(ov::element::i64, ov::Shape{}, {axis});
|
|
50
|
+
result = std::make_shared<ov::op::v8::Gather>(result, gather_indices, gather_axis);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
} // namespace
|
|
57
|
+
|
|
58
|
+
OutputVector translate_pad(const NodeContext & context) {
|
|
59
|
+
num_inputs_check(context, 1, 1);
|
|
60
|
+
|
|
61
|
+
auto input = process_view_input_new(context, 0);
|
|
62
|
+
if (context.get_input_shape(0) == context.get_output_shape()) {
|
|
63
|
+
auto input_shape = std::make_shared<ov::op::v3::ShapeOf>(input);
|
|
64
|
+
auto res = std::make_shared<ov::op::v1::Reshape>(input, input_shape, false);
|
|
65
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const int32_t * op_params = context.get_output_op_params();
|
|
69
|
+
FRONT_END_CHECK_IMPLEMENTED(op_params != nullptr, "PAD requires output op params");
|
|
70
|
+
|
|
71
|
+
const std::array<int32_t, 8> pads = {op_params[0], op_params[1], op_params[2], op_params[3],
|
|
72
|
+
op_params[4], op_params[5], op_params[6], op_params[7]};
|
|
73
|
+
const bool circular = op_params[8] != 0;
|
|
74
|
+
|
|
75
|
+
if (circular) {
|
|
76
|
+
auto res = translate_circular_pad(input, pads, context.get_input_shape(0).to_shape());
|
|
77
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const std::vector<int64_t> pads_begin = {pads[6], pads[4], pads[2], pads[0]};
|
|
81
|
+
const std::vector<int64_t> pads_end = {pads[7], pads[5], pads[3], pads[1]};
|
|
82
|
+
|
|
83
|
+
auto pads_begin_node = ov::op::v0::Constant::create(ov::element::i64, {pads_begin.size()}, pads_begin);
|
|
84
|
+
auto pads_end_node = ov::op::v0::Constant::create(ov::element::i64, {pads_end.size()}, pads_end);
|
|
85
|
+
auto pad_value = ov::op::v0::Constant::create(context.get_input_type(0), ov::Shape{}, {0});
|
|
86
|
+
auto res =
|
|
87
|
+
std::make_shared<ov::op::v1::Pad>(input, pads_begin_node, pads_end_node, pad_value, ov::op::PadMode::CONSTANT);
|
|
88
|
+
|
|
89
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
} // namespace op
|
|
93
|
+
} // namespace ggml
|
|
94
|
+
} // namespace frontend
|
|
95
|
+
} // namespace ov
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
#include <openvino/op/reshape.hpp>
|
|
13
13
|
#include <openvino/op/slice.hpp>
|
|
14
14
|
#include <openvino/op/transpose.hpp>
|
|
15
|
+
#include <vector>
|
|
15
16
|
|
|
16
17
|
namespace ov {
|
|
17
18
|
namespace frontend {
|
|
@@ -22,16 +23,33 @@ OutputVector translate_permute(const NodeContext & context) {
|
|
|
22
23
|
num_inputs_check(context, 1, 1);
|
|
23
24
|
|
|
24
25
|
int op_case = context.get_op_case();
|
|
25
|
-
FRONT_END_CHECK_IMPLEMENTED(op_case
|
|
26
|
-
|
|
26
|
+
FRONT_END_CHECK_IMPLEMENTED(op_case != 0, "Unsupported PERMUTE case");
|
|
27
|
+
// op_case 1 is trivial permute
|
|
28
|
+
// op_case 2 is to permute Q. It has a preceding VIEW that reshapes Q to restore the sequqence dimension
|
|
29
|
+
// op_case 3 4 it to permute KV cache in the default layout
|
|
30
|
+
// op_case 5 6 is to permute V cache when `-fa off`, where v_trans=true
|
|
27
31
|
|
|
28
32
|
ov::Output<Node> res;
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
ov::Output<Node> src;
|
|
34
|
+
if (op_case == 3 || op_case == 4 || op_case == 5 || op_case == 6) {
|
|
35
|
+
src = context.get_input(0);
|
|
36
|
+
} else {
|
|
37
|
+
src = process_view_input_new(context, 0);
|
|
38
|
+
}
|
|
39
|
+
std::vector<int64_t> perm_values{0, 2, 1, 3};
|
|
40
|
+
const int32_t * op_params = context.get_output_op_params();
|
|
41
|
+
if (op_params != nullptr) {
|
|
42
|
+
for (size_t input_axis = 0; input_axis < perm_values.size(); ++input_axis) {
|
|
43
|
+
const size_t output_axis = static_cast<size_t>(op_params[input_axis]);
|
|
44
|
+
perm_values[perm_values.size() - 1 - output_axis] =
|
|
45
|
+
static_cast<int64_t>(perm_values.size() - 1 - input_axis);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
auto perm = ov::op::v0::Constant::create(ov::element::i64, {4}, perm_values);
|
|
31
49
|
|
|
32
50
|
if (op_case == 1 || context.is_stateful()) {
|
|
33
51
|
res = std::make_shared<ov::op::v1::Transpose>(src, perm);
|
|
34
|
-
} else if (op_case ==
|
|
52
|
+
} else if (op_case == 2) {
|
|
35
53
|
auto output_shape = context.get_output_shape().to_shape();
|
|
36
54
|
auto n_heads = ov::op::v0::Constant::create(ov::element::i64, {1}, {output_shape[1]});
|
|
37
55
|
auto head_size = ov::op::v0::Constant::create(ov::element::i64, {1}, {output_shape[3]});
|
|
@@ -54,13 +72,17 @@ OutputVector translate_permute(const NodeContext & context) {
|
|
|
54
72
|
auto output_shape = context.get_output_shape().to_shape();
|
|
55
73
|
int64_t head_size = output_shape[3];
|
|
56
74
|
int64_t n_heads = output_shape[1];
|
|
75
|
+
if (op_case == 5 || op_case == 6) {
|
|
76
|
+
head_size = output_shape[2];
|
|
77
|
+
n_heads = output_shape[1];
|
|
78
|
+
}
|
|
57
79
|
int64_t ctx_per_seq = cache_shape[2].is_static() ? cache_shape[2].get_length() : -1;
|
|
58
80
|
int64_t n_seq = cache_shape[1].get_length();
|
|
59
81
|
|
|
60
82
|
Output<Node> attention_size;
|
|
61
83
|
if (!context.has_input("attention_size")) {
|
|
62
84
|
attention_size = ov::op::v0::Constant::create(ov::element::i64, {1}, {output_shape[2]});
|
|
63
|
-
} else if (op_case ==
|
|
85
|
+
} else if (op_case == 3 || op_case == 5) {
|
|
64
86
|
attention_size = context.get_input("attention_size");
|
|
65
87
|
} else {
|
|
66
88
|
attention_size = context.get_input("attention_size_swa");
|
|
@@ -80,18 +102,41 @@ OutputVector translate_permute(const NodeContext & context) {
|
|
|
80
102
|
seq_active_end = ov::op::v0::Constant::create(ov::element::i64, {1}, {seq_active_end_val});
|
|
81
103
|
}
|
|
82
104
|
|
|
83
|
-
// 1. reshape to [n_seq, ctx_per_seq, n_heads, head_size]
|
|
105
|
+
// 1. reshape to [n_seq, ctx_per_seq, n_heads, head_size] (for `-fa off` [n_seq, n_heads, head_size, ctx_per_seq])
|
|
84
106
|
// 2. slice out the active sequences
|
|
85
107
|
// 3. slice out the attention part in each sequence
|
|
86
|
-
// 4. permute
|
|
108
|
+
// 4. permute (skip for `-fa off`)
|
|
87
109
|
auto zero = ov::op::v0::Constant::create(ov::element::i64, {1}, {0});
|
|
88
110
|
auto one = ov::op::v0::Constant::create(ov::element::i64, {1}, {1});
|
|
89
111
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
112
|
+
if (op_case == 3 || op_case == 4) {
|
|
113
|
+
auto src_reshaped = std::make_shared<ov::op::v1::Reshape>(
|
|
114
|
+
src, ov::op::v0::Constant::create(ov::element::i64, {4}, {n_seq, ctx_per_seq, n_heads, head_size}),
|
|
115
|
+
false);
|
|
116
|
+
ov::Output<ov::Node> after_seq_slice;
|
|
117
|
+
if (n_seq == 1) {
|
|
118
|
+
after_seq_slice = src_reshaped;
|
|
119
|
+
} else {
|
|
120
|
+
after_seq_slice =
|
|
121
|
+
std::make_shared<ov::op::v8::Slice>(src_reshaped, seq_active_start, seq_active_end, one, zero);
|
|
122
|
+
}
|
|
123
|
+
auto slice2 = std::make_shared<ov::op::v8::Slice>(after_seq_slice, zero, attention_size, one, one);
|
|
124
|
+
res = std::make_shared<ov::op::v1::Transpose>(slice2, perm);
|
|
125
|
+
} else {
|
|
126
|
+
auto three = ov::op::v0::Constant::create(ov::element::i64, {1}, {3});
|
|
127
|
+
auto src_reshaped = std::make_shared<ov::op::v1::Reshape>(
|
|
128
|
+
src, ov::op::v0::Constant::create(ov::element::i64, {4}, {n_seq, n_heads, head_size, ctx_per_seq}),
|
|
129
|
+
false);
|
|
130
|
+
ov::Output<ov::Node> after_seq_slice;
|
|
131
|
+
if (n_seq == 1) {
|
|
132
|
+
after_seq_slice = src_reshaped;
|
|
133
|
+
} else {
|
|
134
|
+
after_seq_slice =
|
|
135
|
+
std::make_shared<ov::op::v8::Slice>(src_reshaped, seq_active_start, seq_active_end, one, zero);
|
|
136
|
+
}
|
|
137
|
+
auto slice2 = std::make_shared<ov::op::v8::Slice>(after_seq_slice, zero, attention_size, one, three);
|
|
138
|
+
res = slice2;
|
|
139
|
+
}
|
|
95
140
|
}
|
|
96
141
|
return rename_outputs_with_suffix({res}, context.get_name());
|
|
97
142
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#include "../node_context.h"
|
|
2
|
+
#include "../op_table.h"
|
|
3
|
+
#include "../utils.h"
|
|
4
|
+
#include "ggml.h"
|
|
5
|
+
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <openvino/op/broadcast.hpp>
|
|
8
|
+
#include <openvino/op/constant.hpp>
|
|
9
|
+
#include <openvino/op/divide.hpp>
|
|
10
|
+
#include <openvino/op/shape_of.hpp>
|
|
11
|
+
#include <openvino/op/tile.hpp>
|
|
12
|
+
#include <vector>
|
|
13
|
+
|
|
14
|
+
namespace ov {
|
|
15
|
+
namespace frontend {
|
|
16
|
+
namespace ggml {
|
|
17
|
+
namespace op {
|
|
18
|
+
|
|
19
|
+
// GGML_OP_REPEAT tiles src[0] to fill the destination shape. Every destination
|
|
20
|
+
// dimension is an integer multiple of the corresponding source dimension.
|
|
21
|
+
OutputVector translate_repeat(const NodeContext & context) {
|
|
22
|
+
num_inputs_check(context, 1, 2);
|
|
23
|
+
|
|
24
|
+
auto input = process_view_input_new(context, 0);
|
|
25
|
+
|
|
26
|
+
const auto input_shape = context.get_input_shape(0);
|
|
27
|
+
const auto output_shape = context.get_output_shape();
|
|
28
|
+
|
|
29
|
+
if (input_shape.rank().is_static() && output_shape.rank().is_static() &&
|
|
30
|
+
input_shape.rank() == output_shape.rank()) {
|
|
31
|
+
const auto rank = static_cast<size_t>(input_shape.rank().get_length());
|
|
32
|
+
std::vector<int64_t> repeats(rank, 1);
|
|
33
|
+
bool all_static = true;
|
|
34
|
+
|
|
35
|
+
for (size_t axis = 0; axis < rank; ++axis) {
|
|
36
|
+
if (!input_shape[axis].is_static() || !output_shape[axis].is_static()) {
|
|
37
|
+
all_static = false;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const int64_t input_dim = input_shape[axis].get_length();
|
|
42
|
+
const int64_t output_dim = output_shape[axis].get_length();
|
|
43
|
+
|
|
44
|
+
FRONT_END_OP_CONVERSION_CHECK(input_dim > 0 && output_dim > 0 && output_dim % input_dim == 0,
|
|
45
|
+
"REPEAT input shape ", input_shape, " cannot tile to match ", output_shape);
|
|
46
|
+
|
|
47
|
+
repeats[axis] = output_dim / input_dim;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (all_static) {
|
|
51
|
+
auto repeats_node = ov::op::v0::Constant::create(ov::element::i64, {repeats.size()}, repeats);
|
|
52
|
+
ov::Output<ov::Node> res = std::make_shared<ov::op::v0::Tile>(input, repeats_node);
|
|
53
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Dynamic fallback: tile by the ratio of output to input shape.
|
|
58
|
+
auto input_shape_node = std::make_shared<ov::op::v3::ShapeOf>(input, ov::element::i64);
|
|
59
|
+
std::shared_ptr<ov::Node> target_shape_node;
|
|
60
|
+
if (output_shape.rank().is_static() && output_shape.is_static()) {
|
|
61
|
+
target_shape_node =
|
|
62
|
+
ov::op::v0::Constant::create(ov::element::i64, {output_shape.to_shape().size()}, output_shape.to_shape());
|
|
63
|
+
} else {
|
|
64
|
+
target_shape_node = std::make_shared<ov::op::v3::ShapeOf>(context.get_input(1), ov::element::i64);
|
|
65
|
+
}
|
|
66
|
+
auto repeats_node = std::make_shared<ov::op::v1::Divide>(target_shape_node, input_shape_node);
|
|
67
|
+
ov::Output<ov::Node> res = std::make_shared<ov::op::v0::Tile>(input, repeats_node);
|
|
68
|
+
return rename_outputs_with_suffix({res}, context.get_name());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
} // namespace op
|
|
72
|
+
} // namespace ggml
|
|
73
|
+
} // namespace frontend
|
|
74
|
+
} // namespace ov
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
#include <openvino/op/concat.hpp>
|
|
11
11
|
#include <openvino/op/constant.hpp>
|
|
12
12
|
#include <openvino/op/reshape.hpp>
|
|
13
|
-
#include <stdexcept>
|
|
14
13
|
#include <vector>
|
|
15
14
|
|
|
16
15
|
namespace ov {
|
|
@@ -20,7 +19,8 @@ namespace op {
|
|
|
20
19
|
|
|
21
20
|
OutputVector translate_reshape(const NodeContext & context) {
|
|
22
21
|
num_inputs_check(context, 1, 1);
|
|
23
|
-
if (context.
|
|
22
|
+
if (context.get_input(0).get_partial_shape().is_static() &&
|
|
23
|
+
context.get_input_shape(0) == context.get_output_shape()) {
|
|
24
24
|
return {context.get_input(0)};
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -34,12 +34,12 @@ OutputVector translate_reshape(const NodeContext & context) {
|
|
|
34
34
|
if (op_case == 1) {
|
|
35
35
|
if (context.is_stateful()) {
|
|
36
36
|
new_shape_node = ov::op::v0::Constant::create(
|
|
37
|
-
ov::element::i64, {3},
|
|
38
|
-
std::vector<int64_t>{-1, (int64_t) output_shape[2], (int64_t) output_shape[3]});
|
|
37
|
+
ov::element::i64, {3}, std::vector<int64_t>{-1, (int64_t) output_shape[2], (int64_t) output_shape[3]});
|
|
39
38
|
} else {
|
|
40
39
|
new_shape_node = ov::op::v0::Constant::create(
|
|
41
40
|
ov::element::i64, {4},
|
|
42
|
-
std::vector<int64_t>{(int64_t) output_shape[0], -1, (int64_t) output_shape[2],
|
|
41
|
+
std::vector<int64_t>{(int64_t) output_shape[0], -1, (int64_t) output_shape[2],
|
|
42
|
+
(int64_t) output_shape[3]});
|
|
43
43
|
}
|
|
44
44
|
} else if (op_case == 2) {
|
|
45
45
|
new_shape_node = ov::op::v0::Constant::create(
|
|
@@ -47,7 +47,14 @@ OutputVector translate_reshape(const NodeContext & context) {
|
|
|
47
47
|
std::vector<int64_t>{(int64_t) output_shape[0], (int64_t) output_shape[1], -1, (int64_t) output_shape[3]});
|
|
48
48
|
|
|
49
49
|
} else if (op_case == 3) {
|
|
50
|
-
|
|
50
|
+
// - 14: [ 1, 1024, 1, 1] RESHAPE Vcur-0 (reshaped) (reshaped)
|
|
51
|
+
// [ 512, 2, 1, 1] 0: RESHAPE Vcur-0 (reshaped)
|
|
52
|
+
// - 15: [ 1, 524288, 1, 1] RESHAPE cache_v_l0 (reshaped)
|
|
53
|
+
// [ 512, 1024, 1, 1] 0: NONE cache_v_l0
|
|
54
|
+
// - 16: [ 1, 524288, 1, 1] SET_ROWS cache_v_l0 (reshaped) (view)
|
|
55
|
+
// [ 1, 1024, 1, 1] 0: RESHAPE Vcur-0 (reshaped) (reshaped)
|
|
56
|
+
// [ 1024, 1, 1, 1] 1: NONE leaf_11
|
|
57
|
+
// [ 1, 524288, 1, 1] 2: RESHAPE cache_v_l0 (reshaped)
|
|
51
58
|
new_shape_node = ov::op::v0::Constant::create(
|
|
52
59
|
ov::element::i64, {4}, std::vector<int64_t>{(int64_t) output_shape[0], (int64_t) output_shape[1], -1, 1});
|
|
53
60
|
|
|
@@ -19,7 +19,7 @@ namespace op {
|
|
|
19
19
|
OutputVector translate_rms_norm(const NodeContext & context) {
|
|
20
20
|
num_inputs_check(context, 1, 1);
|
|
21
21
|
|
|
22
|
-
auto input_node = context
|
|
22
|
+
auto input_node = process_view_input_new(context, 0);
|
|
23
23
|
auto square = std::make_shared<ov::op::v1::Power>(
|
|
24
24
|
input_node, ov::op::v0::Constant::create(ov::element::f32, ov::Shape{1}, {2.0f}));
|
|
25
25
|
|