llama.cpp を Intel Arc で SYCL を使って動かす

このページは、まだ未完成です。。。 nicotalk&キャラ素材配布所 http://www.nicotalk.com/charasozai_kt.html (2024年5月16日) この記事を作った動機 Intel Arc A770 LE を使っているが、NVIDIA の RTX や H100 などと異なり、標準でのサポートが薄い。そのため、フルで性能を引き出したい場合は、自分で LLM なら llama.cpp などを OneAPI を使ってコンパイルする必要がある。 LLM に関しては、当初は Intel Arc の環境において LM Studio を利用していたが、Vulkan でしか少なくとも現状では動作させることができなかった。Ollama についても試したが、どう頑張っても Apple の メタルプラットフォーム向けにしかコンパイルが動作せず、どうしよもない感じであった。そこでそれらのバックエンドである、llama.cpp を直接コンパイルして動かすことが考えられ、フロントは別に LibreChat を独立して用意する事が考えられた。 標準でも Vulkan の互換モードで動作し、使えないということはないが、多少性能が失われる。ただ、SYCL など向けに、Intel Arc を最大限使えるようにしようとすると、自分でコンパイルする必要がある。専用に用意しなければ現状では llama.cpp などは CPU しか利用できないとして Intel Arc をそもそも認識しないという挙動になった。またコンパイル自体や、コンパイル後のバイナリの扱いについて、特別な扱いが必要である。 Intel が公式で llama.cpp などのバイナリを配布していたりするが、バージョンが古く新しいモデルが動かないなど、弊害が生じる場合があった。 これらのことから、Intel Arc 向けに今回は、llama.cpp を SYCL を使えるようにコンパイルすることにした。また、PKGBUILD も作成し、手動で手順を踏まなくても、ある程度自動で Arch Linux や同じ系列の OS を使っていれば、環境が整うように工夫した。 Gemini Fast 3 を作業補助として使い、動くか確認しながら作業をして動くことを確認できた。ただそれだけだと、情報が十分まとまっておらず、環境を再構築する必要が生じたときなどに困難が想像されたため、記録を残して現状を整理したい。なお、特にコンパイルや SYCL 周りの環境変数などは、LLM が吐き出したものをそのまま使っているだけの部分が多く色々間違っていたりする可能性がある。あくまで私の環境でやってみて動くかというのを基準にして書いている。 llama.cpp をコンパイル OneAPI を導入する yay -Sy intel-oneapi-toolkit # sudo pacman -Sy intel-oneapi-toolkit llama.cppのリポジトリをクローン git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp コンパイル # OneAPI を読み込む source /opt/intel/oneapi/setvars.sh export CFLAGS="-fno-stack-protector -U_FORTIFY_SOURCE" export CXXFLAGS="-fno-stack-protector -U_FORTIFY_SOURCE" # コンパイル cmake -B build -S llama.cpp -G Ninja \ -DGGML_SYCL=ON \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_C_COMPILER=icx \ -DCMAKE_CXX_COMPILER=icpx \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr cmake --build build SYCL を有効にした状態で llama.cpp を起動する # オプションの調整用環境変数 export ZE_MAX_UNUSED_DEVICE_ALLOCATIONS_SIZE=1 export SYCL_PI_LEVEL_ZERO_DEVICE_RESERVE_MEMORY=0 export SYCL_PI_LEVEL_ZERO_DEVICE_SCOPE_EVENTS=0 export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 export SYCL_PI_LEVEL_ZERO_TRACK_INDIRECT_ACCESS_MEMORY=1 export L0_SCS_MAX_MEM_ALLOC_SIZE=16106127360 export SYCL_PI_LEVEL_ZERO_USM_RESIDENT=0 # oneAPIの環境を読み込む source /opt/intel/oneapi/setvars.sh # llama.cpp に関連する設定について MODEL_PATH="/modelPath/lmstudio/lmstudio-community/gpt-oss-20b-GGUF/gpt-oss-20b-MXFP4.gguf" PORT=8080 HOST=0.0.0.0 GPU_LAYERS=999 ADDITIONAL_ARGS="--ctx-size 4096 --parallel 2" # 画像などを添付する場合は、モデルファイルに付属している mmprojファイルもセットで指定する必要がある。 # ADDITIONAL_ARGS="--ctx-size 4096 --parallel 2 --mmproj ファイルパス.gguf" # dnnl のパスを通す export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/oneapi/dnnl/latest/lib # サーバー起動 exec /usr/bin/llama-server \ -m "$MODEL_PATH" \ --port "$PORT" \ --host "$HOST" \ -ngl "$GPU_LAYERS" \ $ADDITIONAL_ARGS llama.cpp の PKGBUILD について 使い方 すでに作業ディレクトリを作成し、配置するファイルの事項に従って必要なファイルを配置していることを前提とする。 ...

2026年5月22日