2026年10月21日水曜日

stable-diffusion.cpp で sycl は今のところ無理っぽい/(^o^)\

8/11日以降のバージョンでビルドすると処理の途中でsegment faultが発生して実行できなくなっていました。

時間を見つけては処理を追いかけて、いくつかの仮定を設定していろいろな角度から調べていました。一度、gdbを使って見たのですが、デバッガがまともに動いているのかどうかも良く分からないので放置していましたが、改めて実行してみたところ以下の通り。 

Thread 1 "sd-cli" received signal SIGSEGV, Segmentation fault.
0x00007ffff7c57244 in sycl::_V1::detail::DeviceKernelInfo::setCompileTimeInfoIfNeeded(sycl::_V1::detail::compile_time_kernel_info_v1::CompileTimeKernelInfoTy const&) ()
   from /opt/intel/oneapi/compiler/2026.1/lib/libsycl.so.9

最初にgdbを実行したときも同様の出力だったのですが、ログと絡ませて見てみるとやはりここで落ちているのは確かなようなので、これを前提に考えると、「ライブラリのバグっぽい」という事に行きつきました。

ダメもとで、apt updateで確認してみると何やらoneAPIのアップデートがかかっている様子。(aptのメインの自動実行を止めているもので…w)

結果、下記の通りアップデートされました。 

intel-deep-learning-essentials/all 2026.2.0-631 amd64 [2026.1.4-15 からアップグレード可]
intel-ocloc/noble 26.31.39395.16-1~24.04~ppa1 amd64 [26.31.39395.14-1~24.04~ppa1 からアップグレード 可]
intel-oneapi-advisor/all 2026.0.1-60 amd64 [2026.0.0-263 からアップグレード可]
intel-oneapi-ccl-devel/all 2022.2.0-433 amd64 [2022.1.2-9 からアップグレード可]
intel-oneapi-common-licensing/all 2026.2.0-35 all [2026.0.0-235 からアップグレード可]
intel-oneapi-common-oneapi-vars/all 2026.2.0-35 all [2026.0.0-235 からアップグレード可]
intel-oneapi-common-vars/all 2026.2.0-35 all [2026.0.0-235 からアップグレード可]
intel-oneapi-compiler-dpcpp-cpp/all 2026.2.0-863 amd64 [2026.1.1-325 からアップグレード可]
intel-oneapi-dal-devel/all 2026.2.0-299 amd64 [2026.1.0-7 からアップグレード可]
intel-oneapi-dev-utilities/all 2026.2.0-51 amd64 [2026.0.1-16 からアップグレード可]
intel-oneapi-dnnl-devel/all 2026.1.0-617 amd64 [2026.0.2-40 からアップグレード可]
intel-oneapi-ipp-devel/all 2026.1.0-760 amd64 [2026.0.1-51 からアップグレード可]
intel-oneapi-ippcp-devel/all 2026.2.0-177 amd64 [2026.0.1-9 からアップグレード可]
intel-oneapi-mkl-devel/all 2026.2.0-881 amd64 [2026.1.0-236 からアップグレード可]
intel-oneapi-mpi-devel/all 2021.19.0-561 amd64 [2021.18.1-9 からアップグレード可]
intel-oneapi-tbb-devel/all 2023.2.0-492 amd64 [2023.1.0-151 からアップグレード可]
intel-oneapi-tlt/all 2026.2.0-30 amd64 [2026.0.0-220 からアップグレード可]
intel-oneapi-vtune/all 2026.6.0-142 amd64 [2026.4.0-20 からアップグレード可]
intel-opencl-icd/noble 26.31.39395.16-1~24.04~ppa1 amd64 [26.31.39395.14-1~24.04~ppa1 からアップグレード可]
intel-pti-dev/all 1.2.0-71 amd64 [1.1.0-81 からアップグレード可] 

リリースバージョン リリース日
2026.1.1 2026年7月29日
2026.1 2026年7月7日
2026.0 2026年4月29日

とのことで、結構前ですねw 前回apt updateかけたのは…10月12日のログがあるので…あれ?おかしいなぁ…まぁいいかw

で、インストール後にさっそくcmakeしてみたところエラーが出てしまった… 

-- Performing Test LIBWEBM_HAVE_CXX_FLAG
-- Performing Test LIBWEBM_HAVE_CXX_FLAG - Failed
CMake Error at thirdparty/libwebm/build/cxx_flags.cmake:50 (message):
  LIBWEBM requires support for CXX flag: -std=c++11.
Call Stack (most recent call first):
  thirdparty/libwebm/build/cxx_flags.cmake:63 (require_cxx_flag)
  thirdparty/libwebm/CMakeLists.txt:37 (require_cxx_flag_nomsvc)


-- Configuring incomplete, errors occurred!

検索をかけまくってもこれと言った解決策が無さそうでした。

おそらく直接的な原因はoneAPIに同梱されているicpxのオプションで-std=c++11が指定できなくなったことに由来すると思われますが、oneAPIのリリース情報見ても何も書いてないんだよな…

2026.1.1
新機能と拡張
    SYCL グラフのネイティブ記録モードが有効な場合、制限付きのホストタスク (英語) (sycl::ext::oneapi::experimental::host_task) をキャプチャーできるようになりました。
    SYCL グラフの記録中にプロセス固有のグラフ ID を照会する command_graph::get_id() を追加しました。 

https://www.xlsoft.com/jp/products/intel/tech/release-notes/intel-oneapi-dpcpp-compiler-2026.html#where-to-find-the-release 

なので、stable-diffusion.cppのドキュメントから、このモジュール自体無効化できるのでOFFにすることに。cmakeのオプションに-DSD_WEBP=OFF -DSD_WEBM=OFFを追加して…(あとはシステム内のモジュールをそのまま利用する形にもできるようなのでそちらの方がベターかと思いますが)

とりあえず、cmakeが通って、バイナリが作成されました。

コンパイル時の表示がなんかものすごく多くなった感じがしますが、まぁ置いておいて… 

そしてさらなる問題。

 [I] loading tensors completed, taking 0.20s (read: 0.14s, memcpy: 0.00s, convert: 0.00s, copy_to_backend: 0.00s) --- model_loader.cpp:1401
[W] model manager memory on SYCL0: reported free 636.22 MB / total 10288.35 MB, tracked weights 766.01 MB / other runtime 0.00 MB / current runtime 214.19 MB --- model_manager.cpp:1788
[W] model manager cannot make enough memory available on SYCL0: need 695.40 MB device / 397.59 MB budget, available 636.22 MB device / unlimited budget --- model_manager.cpp:2018
[W] model manager memory on SYCL0: reported free 651.05 MB / total 10303.18 MB, tracked weights 0.00 MB / other runtime 0.00 MB / current runtime 15.94 MB --- model_manager.cpp:1788
[W] model manager cannot make enough memory available on SYCL0: need 887.77 MB device / 391.71 MB budget, available 651.05 MB device / unlimited budget --- model_manager.cpp:2018
[E] z_image segment 6/36 (z_image.layers.0) failed during weight preparation --- ggml_runner.cpp:899
[E] diffusion model compute failed --- diffusion_engine.cpp:2751
[E] Diffusion model sampling failed --- diffusion_engine.cpp:2972
[E] sampling for image 1/1 failed after 16.70s --- image.cpp:907
[E] generate failed --- main.cpp:940

えっと…まぁ結局エラーです(笑)

メモリ表示が怪しいなとは思ってはいたんですけど、やはりここで表示されているメモリ表示がまぁエラーだわな…と言う数字。

出力にデバックが便利なファイル名とその行数まで出ているので追いかけやすい!

とどのつまりは、model_manager.cpp 1513行のこの部分になるのだと思います。

    // The loader may retain device mappings after their parameter blocks are released.
    for (ggml_backend_buffer_t buffer : model_loader_.get_device_mmap_buffers()) {
        add_buffer(buffer);
    } 

 処理内容は定かじゃないですが、get_device_mmap_buffersって…syclはMMAPが機能していないとかだったので、動くはずもなく…w

syclのパッチあて作業中にggml-sycl.cpp内で結構初期化関連の変更があったので期待していたのですが、それ以前の問題な気配が濃厚です…どうしましょうかねw新しいモデルをsyclで動かしてみたかったんですが…orz

ちなみにstable-diffusion.cppが8/11日以降、突然オブジェクト指向に目覚めたらしく、ソースが結構細切れにされたり、オブジェクト化されまくったり、再設計が入っていたりととても面白いことになってたりします。ソースは追いかけやすくなったのですが、動作の仕組みを知ってないと結構難しそうな気がしています。

flux3とかsyclで動かしたかったんだけどなぁ… 

0 件のコメント:

コメントを投稿