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.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -4
  3. data/ext/options.rb +1 -1
  4. data/ext/ruby_whisper.c +0 -1
  5. data/ext/ruby_whisper.h +7 -1
  6. data/ext/ruby_whisper_context.c +50 -1
  7. data/ext/ruby_whisper_log_settable.h +1 -2
  8. data/ext/ruby_whisper_params.c +9 -8
  9. data/ext/ruby_whisper_transcribe.cpp +0 -19
  10. data/ext/ruby_whisper_vad_context.c +30 -10
  11. data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
  12. data/ext/ruby_whisper_vad_params.c +4 -4
  13. data/ext/ruby_whisper_vad_segment.c +2 -2
  14. data/ext/sources/CMakeLists.txt +2 -1
  15. data/ext/sources/cmake/parakeet.pc.in +2 -2
  16. data/ext/sources/cmake/whisper.pc.in +2 -2
  17. data/ext/sources/examples/cli/cli.cpp +9 -1
  18. data/ext/sources/examples/common-ggml.cpp +2 -0
  19. data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
  20. data/ext/sources/ggml/CMakeLists.txt +3 -4
  21. data/ext/sources/ggml/include/ggml-cuda.h +0 -3
  22. data/ext/sources/ggml/include/ggml-sycl.h +8 -0
  23. data/ext/sources/ggml/include/ggml.h +3 -1
  24. data/ext/sources/ggml/src/CMakeLists.txt +8 -1
  25. data/ext/sources/ggml/src/ggml-backend-meta.cpp +7 -4
  26. data/ext/sources/ggml/src/ggml-common.h +13 -2
  27. data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +1 -1
  28. data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +5 -6
  29. data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +78 -4
  30. data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +142 -4
  31. data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +7 -2
  32. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +14 -0
  33. data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +26 -19
  34. data/ext/sources/ggml/src/ggml-cpu/ops.cpp +129 -46
  35. data/ext/sources/ggml/src/ggml-cpu/quants.c +51 -0
  36. data/ext/sources/ggml/src/ggml-cpu/quants.h +3 -0
  37. data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +1 -1
  38. data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +11 -0
  39. data/ext/sources/ggml/src/ggml-cpu/vec.cpp +2 -2
  40. data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +90 -46
  41. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  42. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  43. data/ext/sources/ggml/src/ggml-cuda/common.cuh +4 -0
  44. data/ext/sources/ggml/src/ggml-cuda/concat.cu +33 -21
  45. data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
  46. data/ext/sources/ggml/src/ggml-cuda/convert.cu +86 -34
  47. data/ext/sources/ggml/src/ggml-cuda/cpy.cu +80 -29
  48. data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +9 -5
  49. data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +4 -0
  50. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +9 -5
  51. data/ext/sources/ggml/src/ggml-cuda/fattn.cu +27 -21
  52. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +40 -25
  53. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
  54. data/ext/sources/ggml/src/ggml-cuda/getrows.cu +15 -12
  55. data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +718 -1248
  56. data/ext/sources/ggml/src/ggml-cuda/mmq.cu +7 -0
  57. data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +77 -40
  58. data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +55 -12
  59. data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +64 -4
  60. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
  61. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
  62. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
  63. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
  64. data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +7 -1
  65. data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +1 -0
  66. data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +1 -0
  67. data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +0 -5
  68. data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +1634 -1293
  69. data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +11 -40
  70. data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +13 -15
  71. data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +1 -1
  72. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1749 -399
  73. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
  74. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
  75. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +26 -23
  76. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
  77. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +1 -83
  78. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
  79. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
  80. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +9 -0
  81. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +27 -4
  82. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +59 -37
  83. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +11 -3
  84. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +52 -12
  85. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
  86. data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +2 -1
  87. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +14 -30
  88. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +39 -0
  89. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
  90. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
  91. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
  92. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +39 -0
  93. data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +127 -32
  94. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3023 -4425
  95. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
  96. data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +48 -13
  97. data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +10 -9
  98. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
  99. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
  100. data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +168 -50
  101. data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +0 -4
  102. data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +5 -0
  103. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +69 -5
  104. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +4 -1
  105. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +27 -6
  106. data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +38 -0
  107. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +132 -2
  108. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +2 -0
  109. data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +345 -87
  110. data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +13 -0
  111. data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
  112. data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +4060 -357
  113. data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +198 -0
  114. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
  115. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
  116. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
  117. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
  118. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
  119. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
  120. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +74 -6
  121. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +74 -6
  122. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +74 -6
  123. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +71 -6
  124. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +74 -6
  125. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +74 -6
  126. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +74 -6
  127. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +74 -6
  128. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
  129. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
  130. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q8_0_f32.cl +1 -1
  131. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
  132. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
  133. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
  134. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
  135. data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
  136. data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
  137. data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
  138. data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
  139. data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
  140. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +733 -130
  141. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
  142. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +57 -3
  143. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
  144. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +307 -59
  145. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +66 -0
  146. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
  147. data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
  148. data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
  149. data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
  150. data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
  151. data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
  152. data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
  153. data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
  154. data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
  155. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
  156. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
  157. data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
  158. data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
  159. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
  160. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
  161. data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
  162. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
  163. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
  164. data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
  165. data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
  166. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
  167. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
  168. data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
  169. data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
  170. data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
  171. data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
  172. data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
  173. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
  174. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +134 -38
  175. data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
  176. data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
  177. data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
  178. data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
  179. data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
  180. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
  181. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
  182. data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
  183. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -23
  184. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -5
  185. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
  186. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +43 -40
  187. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
  188. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +548 -3
  189. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +28 -26
  190. data/ext/sources/ggml/src/ggml-openvino/utils.cpp +383 -94
  191. data/ext/sources/ggml/src/ggml-openvino/utils.h +11 -8
  192. data/ext/sources/ggml/src/ggml-quants.c +76 -0
  193. data/ext/sources/ggml/src/ggml-quants.h +3 -0
  194. data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +5 -5
  195. data/ext/sources/ggml/src/ggml-sycl/backend.hpp +2 -0
  196. data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
  197. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
  198. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
  199. data/ext/sources/ggml/src/ggml-sycl/common.cpp +6 -8
  200. data/ext/sources/ggml/src/ggml-sycl/common.hpp +19 -2
  201. data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
  202. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
  203. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
  204. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
  205. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
  206. data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
  207. data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
  208. data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
  209. data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
  210. data/ext/sources/ggml/src/ggml-sycl/convert.cpp +6 -0
  211. data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
  212. data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
  213. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
  214. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
  215. data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +15 -0
  216. data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +492 -319
  217. data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
  218. data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -115
  219. data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -0
  220. data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1006 -336
  221. data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +252 -67
  222. data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +17 -0
  223. data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
  224. data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
  225. data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
  226. data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
  227. data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
  228. data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +10 -2
  229. data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
  230. data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +35 -0
  231. data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +5 -0
  232. data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +833 -215
  233. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
  234. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +1 -1
  235. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
  236. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -3
  237. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +1 -0
  238. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +1 -0
  239. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
  240. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
  241. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +23 -4
  242. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +14 -18
  243. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
  244. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +21 -24
  245. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +31 -23
  246. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +6 -5
  247. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +84 -67
  248. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
  249. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
  250. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
  251. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -3
  252. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
  253. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +121 -74
  254. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +26 -19
  255. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +31 -36
  256. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +16 -2
  257. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +7 -7
  258. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +21 -0
  259. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +439 -320
  260. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +2 -2
  261. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +45 -39
  262. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +586 -465
  263. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +63 -69
  264. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +14 -9
  265. data/ext/sources/ggml/src/ggml.c +36 -14
  266. data/ext/sources/include/whisper.h +21 -0
  267. data/ext/sources/src/whisper.cpp +164 -14
  268. data/lib/whisper/log_settable.rb +5 -8
  269. data/lib/whisper/model/uri.rb +0 -7
  270. data/sig/whisper.rbs +6 -0
  271. data/test/test_vad.rb +9 -0
  272. data/test/test_vad_context.rb +2 -2
  273. data/whispercpp.gemspec +1 -1
  274. metadata +62 -37
  275. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-flash-attn-ops.c +0 -1878
  276. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c +0 -2066
  277. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.c +0 -6
  278. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.h +0 -88
  279. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-profile.h +0 -34
  280. data/ext/sources/ggml/src/ggml-hexagon/htp/vtcm-utils.h +0 -16
  281. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_gelu.cpp +0 -25
  282. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
  283. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
  284. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
  285. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
  286. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
  287. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -20
  288. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
  289. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
  290. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
  291. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
  292. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
  293. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
  294. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
  295. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
  296. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
  297. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
  298. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
  299. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
  300. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
  301. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
  302. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
  303. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
  304. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
  305. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
  306. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
  307. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
  308. 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 = context.get_input(0);
34
- ov::Output<ov::Node> A = context.get_input(1);
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) A_shape[3]});
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 == 1 || op_case == 2 || op_case == 3 || op_case == 4,
26
- "Unsupported PERMUTE case");
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
- auto src = context.get_input(0);
30
- auto perm = ov::op::v0::Constant::create(ov::element::i64, {4}, {0, 2, 1, 3});
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 == 4) {
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 == 2) {
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
- auto src_reshaped = std::make_shared<ov::op::v1::Reshape>(
91
- src, ov::op::v0::Constant::create(ov::element::i64, {4}, {n_seq, ctx_per_seq, n_heads, head_size}), false);
92
- auto slice1 = std::make_shared<ov::op::v8::Slice>(src_reshaped, seq_active_start, seq_active_end, one, zero);
93
- auto slice2 = std::make_shared<ov::op::v8::Slice>(slice1, zero, attention_size, one, one);
94
- res = std::make_shared<ov::op::v1::Transpose>(slice2, perm);
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.get_input_shape(0) == context.get_output_shape()) {
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], (int64_t) output_shape[3]});
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
- throw std::runtime_error("might be outdated RESHAPE case");
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.get_input(0);
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