initial Intel GPU support for whisper.cpp with SYCL and BLAS#2
initial Intel GPU support for whisper.cpp with SYCL and BLAS#2izelnakri wants to merge 4 commits intokilyanni:mainfrom
Conversation
| postInstall = '' | ||
| for binary in $out/bin/*; do | ||
| if [[ -f "$binary" && -x "$binary" ]]; then | ||
| wrapProgram "$binary" \ | ||
| --prefix LD_LIBRARY_PATH : "/run/opengl-driver/lib:/run/opengl-driver-32/lib:${openvino}/runtime/lib/intel64" | ||
| fi | ||
| done | ||
| ''; |
There was a problem hiding this comment.
Does autoAddDriverRunpath work, or does it cause issues with openvino?
There was a problem hiding this comment.
Actually I'm not sure openvino part works yet. Is autoAddDriverRunpath has some advantages over wrapProgram or less costs or is it the convention? I've also seen it in the driver packaging so far.
There was a problem hiding this comment.
It's the convention for GPU stuff (especially with CUDA). Wrappers also add (minor) unneeded overhead compared to patching (which autoAddDriverRunpath does). Also, autoAddDriverRunpath is a oneliner (just add to nativeBuildInputs) as opposed to this wrapping
There was a problem hiding this comment.
Did you try autoAddDriverRunpath? Did it work?
I can't really test because AMDGPU works differently
There was a problem hiding this comment.
I'm trying to improve nixpkgs#openvino first, so I wont even need LD_LIBRARY_PATH for it hopefully, then will look into this.
There was a problem hiding this comment.
Hi again @blenderfreaky I've added autoAddDriverRunpath but I now get these runtime errors few seconds after booting up the whisper.cpp:
[Start speaking]
[BLANK_AUDIO]level_zero backend failed with error: 20 (UR_RESULT_ERROR_DEVICE_LOST)
Exception caught at file:/build/source/ggml/src/ggml-sycl/ggml-sycl.cpp, line:3930, func:operator()
SYCL error: CHECK_TRY_ERROR((stream)->wait()): Exception caught in this line of code.
in function ggml_backend_sycl_synchronize at /build/source/ggml/src/ggml-sycl/ggml-sycl.cpp:3930
/build/source/ggml/src/ggml-sycl/../ggml-sycl/common.hpp:126: SYCL error
[New LWP 23765]
[New LWP 23721]
[New LWP 23720]
[New LWP 23715]
[New LWP 23712]
[New LWP 23710]
warning: Loadable section ".dynstr" outside of ELF segments
in /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/bin/whisper-stream
warning: File "/nix/store/fkw48vh7ivlvlmhp4j30hy2gvg00jgin-gcc-14.3.0-lib/lib/libstdc++.so.6.0.33-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load:/nix/store/dj06r96j515npcqi9d8af1d1c60bx2vn-gcc-14.3.0-lib".
To enable execution of this file add
add-auto-load-safe-path /nix/store/fkw48vh7ivlvlmhp4j30hy2gvg00jgin-gcc-14.3.0-lib/lib/libstdc++.so.6.0.33-gdb.py
line to your configuration file "/home/izelnakri/.config/gdb/gdbinit".
To completely disable this security protection add
set auto-load safe-path /
line to your configuration file "/home/izelnakri/.config/gdb/gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual. E.g., run from the shell:
info "(gdb)Auto-loading safe path"
warning: File "/nix/store/7yk44bwycl6pfd15wrgj5pm6f9vwd5c0-intel-llvm-nightly-2025-08-05/lib/libsycl.so.8.0.0-0-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load:/nix/store/dj06r96j515npcqi9d8af1d1c60bx2vn-gcc-14.3.0-lib".
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/nix/store/g8zyryr9cr6540xsyg4avqkwgxpnwj2a-glibc-2.40-66/lib/libthread_db.so.1".
0x00007f212310a87b in wait4 () from /nix/store/lmn7lwydprqibdkghw7wgcn21yhllz13-glibc-2.40-66/lib/libc.so.6
#0 0x00007f212310a87b in wait4 () from /nix/store/lmn7lwydprqibdkghw7wgcn21yhllz13-glibc-2.40-66/lib/libc.so.6
#1 0x00007f2123d732e6 in ggml_print_backtrace () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libggml-base.so
#2 0x00007f2123d72912 in ggml_abort () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libggml-base.so
#3 0x00007f21238410cb in ggml_sycl_error(char const*, char const*, char const*, int, char const*) () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libggml-sycl.so
#4 0x00007f212386f3d1 in ggml_backend_sycl_synchronize(ggml_backend*) () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libggml-sycl.so
#5 0x00007f2123d8cb1b in ggml_backend_sched_graph_compute () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libggml-base.so
#6 0x00007f2123f7bd65 in ggml_graph_compute_helper(ggml_backend_sched*, ggml_cgraph*, int, bool) () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libwhisper.so.1
#7 0x00007f2123f75072 in whisper_encode_internal(whisper_context&, whisper_state&, int, int, bool (*)(void*), void*) () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libwhisper.so.1
#8 0x00007f2123f7e0c5 in whisper_full_with_state () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libwhisper.so.1
#9 0x00007f2123f89aeb in whisper_full () from /nix/store/fr456rbg61nnnfq6z9ffbg64llf111x4-whisper-cpp/lib/libwhisper.so.1
#10 0x00000000004134ea in main ()
[Inferior 1 (process 23699) detached]
^C^C^C^C^C^C^C^C^C^C^Czsh: abort (core dumped) ./result/bin/whisper-stream -m ~/Github/whisper.cpp/models/ggml-base.en.bin -Granted I didnt rebase with master yet, so could be that src.llvm packages aren't with autoAddDriverRunpath on my branch and this might be causing it. Regardless since this is the only stable version(unless I get a confirmation from you that we can try with rebasing master now), lets merge this PR and try to remove this block later.
be06b89 to
6281df4
Compare
6281df4 to
f17e57d
Compare
| pugixml | ||
| snappy | ||
| tbb_2022 | ||
| tree |
There was a problem hiding this comment.
[nit] This seems like a debugging leftover?
| tree |
| tbb_2022, | ||
| cudaPackages, | ||
|
|
||
| tree |
| # prevent scons from leaking in the default python version | ||
| scons' = scons.override { inherit python3Packages; }; | ||
|
|
||
| tbbbind_version = "2_5"; |
There was a problem hiding this comment.
is this not provided by our oneTBB derivation? The docs claim this should be included
There was a problem hiding this comment.
(didn't mean to reference scons', only tbbbind)
There was a problem hiding this comment.
I prefer to take small steps, didn't manage to try to remove/upgrade this. Code is mainly from nixpkgs with improvements. Better to do this one in an another PR perhaps for stability
| "-DOpenCV_DIR=${lib.getLib opencv}/lib/cmake/opencv4/" | ||
| "-DProtobuf_LIBRARIES=${protobuf}/lib/libprotobuf${stdenv.hostPlatform.extensions.sharedLibrary}" | ||
| "-DPython_EXECUTABLE=${python.interpreter}" |
There was a problem hiding this comment.
Does it fail to auto-discover if you put python in nativeBuildInputs?
For python for example they seem to search normally, see here
| postFixup = '' | ||
| # Link to OpenCL | ||
| find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do | ||
| addDriverRunpath "$lib" | ||
| done | ||
| ''; |
There was a problem hiding this comment.
| postFixup = '' | |
| # Link to OpenCL | |
| find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do | |
| addDriverRunpath "$lib" | |
| done | |
| ''; | |
| nativeBuildInputs = [ | |
| ... | |
| autoAddDriverRunpath | |
| ]; |
The hook should do basically the same thing
My initial milestone of 3-4 months ago, now even better with BLAS 😅 🎉 🎉
Working flawlessly real-time on my Lunar Lake GPU!!