1. はじめに
ノート PC を新調してスペック(と気分)がアガったので、これまで手を出せなかった生成 AI アプリを Dify で作ってみようと思い立ちました。
参考にした情報は以下。
今回は特にプロキシを使う環境ではなかったのですが、説明が分かりやすかったので参考にさせていただきました。
手順に従い、インストーラで Ollama を入れて動作確認します。今回、LLM は 15 歳の現役高校生(!)が作った『ArrowPro-7B-KUJIRA』1を使ってみました。
おおお、動いた!すごい!!
感動です。ノート PC を新調した甲斐がありました。
さて負荷はどんな感じかな、とタスクマネージャーを覗いてみたところ。。。
・・・GPU 使ってなくない?
2. 環境
OS: Windows 11 Home
CPU: Intel(R) Core(TM) Ultra 7 155H 3.80 GHz
RAM: 32GB
GPU: Intel(R) Arc(TM) Graphics ←これ!
3. 対処
ググってみたところ、Run Ollama with IPEX-LLM on Intel GPU という、それっぽい記事を見つけました。
Intel の GPU を使ってもらうにはインストーラーで入れた Ollama ではダメなようで、手作業でのセットアップが必要なようです。2
Visit Run llama.cpp with IPEX-LLM on Intel GPU Guide, and follow the instructions in section Prerequisites to setup and section Install IPEX-LLM cpp to install the IPEX-LLM with Ollama binaries.
(「llama.cpp with IPEX-LLM on Intel GPU Guide」を参照し、「Prerequisites」セクションの指示に従ってセットアップ、「Install IPEX-LLM cpp」セクションの指示に従って Ollama バイナリをインストールします。)
llama.cpp を先にセットアップしなさいとたらい回しアドバイスされます。
というわけで、まずは llama.cpp のセットアップを実施します。
3.1. llama.cpp のセットアップ
ざっと目を通してみると、Miniforge プロンプトでコマンドを入力する必要があるようなので、Miniforge が未インストールの場合は
GitHub - conda-forge/miniforge: A conda-forge distribution.
でインストーラーを取得し、インストールを行います。
ちなみにインストールでは、私は上記のように上3つにチェックを入れました(デフォルト状態では一番上の1つのみがチェックされています)。
以降の手順において、Miniforge プロンプトでコマンドを実行する際に上手くいかない場合があるかもしれないため、2番目(Miniforge3 の PATH 追加)にはチェックを入れておいた方がよいかもしれません。
3.1.1. IPEX-LLM のインストール
conda create -n llm-cpp python=3.11
conda activate llm-cpp
pip install --pre --upgrade ipex-llm[cpp]
Miniforge プロンプトで上記のコマンドを実行します。
これで、"llm-cpp" という Python の仮想環境が作成され、「IPEX-LLM」がインストールされます。
mkdir llama-cpp
続けて、任意の場所に "llama-cpp" ディレクトリを作成します。
上記コマンドはカレントディレクトリに "llama-cpp" ディレクトリを作成しています。
3.1.2. llama.cpp の実行環境のセットアップ
管理者権限で Miniforge プロンプトを別に起動し、先程作成した "llama-cpp" ディレクトリに移動します(cd "llama-cpp"ディレクトリのパス
)。
conda activate llm-cpp
init-llama-cpp.bat
上記コマンドを実行すると、"llama-cpp" ディレクトリ内に Python ファイルや DLL、大量のシンボリックリンクが作成されます。
シンボリックリンクの作成に管理者権限が必要であるため、Miniforge プロンプトを管理者権限で起動する必要があります。
情報元サイトには conda activate llm-cpp
のコマンドは記載されていませんが、init-llama-cpp.bat
の実行の前にこれが必要です。
3.2. Ollama の実行環境のセットアップ
引き続き、管理者権限で起動した Miniforge プロンプトにて作業します。
init-ollama.bat
カレントディレクトリが "llama-cpp" ディレクトリであることを確認して、上記コマンドを実行します。
すると、"llama-cpp" ディレクトリ内に Ollama 関連のシンボリックリンクが作成されます。
「3.1.2. llama.cpp の実行環境のセットアップ」で conda activate llm-cpp
のコマンドを実行済みであるため、ここでの同コマンドの実行は必要ありません。
3.3. 環境変数 PATH の設定
必須の対応ではありませんが、どこからでも "ollama" コマンドを叩けるようにするため、私は "llama-cpp" ディレクトリを Windows 環境変数「PATH」に追加しました。
4. Ollama サーバーの起動
Miniforge プロンプトを起動します(通常ユーザー権限でOKです)。
conda activate llm-cpp
set OLLAMA_NUM_GPU=999
set no_proxy=localhost,127.0.0.1
set ZES_ENABLE_SYSMAN=1
set SYCL_CACHE_PERSISTENT=1
set SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
set OLLAMA_HOST=0.0.0.0
set OLLAMA_ORIGINS=*
ollama serve
上記コマンドを実行すると Ollama サーバーが立ち上がります。
情報元サイトには
set SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
の環境変数登録コマンドについて以下の注意書きがあります。
under most circumstances, the following environment variable may improve performance, but sometimes this may also cause performance degradation
(たいていの場合、以下の環境変数によってパフォーマンスが向上する可能性がありますが、場合によってはパフォーマンスの低下を引き起こすこともあります。)
調べたところ、Intel のサイト「Level Zero Immediate Command Lists」に以下のような記載がありました。
On Intel® Arc™ Graphics, Intel® Data Center GPU Flex Series and Intel® Data Center GPU Max Series, a custom kernel with VM_BIND is used to support ULLS. There has not been much performance tuning of this feature on Intel® Arc™ Graphics and Intel® Data Center GPU Flex Series, with the focus being on Intel® Data Center GPU Max Series.
(インテル® Arc™ グラフィックス、インテル® Data Center GPU Flex シリーズ、およびインテル® Data Center GPU Max シリーズでは、ULLS をサポートするために VM_BIND を備えたカスタム・カーネルが使用されます。インテル® Arc™ グラフィックスとインテル® Data Center GPU Flex シリーズでは、この機能のパフォーマンスチューニングはあまり行われておらず、インテル® Data Center GPU Max シリーズに重点が置かれています。)
データセンター用の GPU に注力しているということですね(うーむ )。
場合によっては、この環境変数は外しておいた方がよいかもしれません。
続けて、もうひとつチャット起動用に Miniforge プロンプトを起動します(こちらも通常ユーザー権限で OK です)。
conda activate llm-cpp
ollama run hawkclaws/datapilot-arrowpro-7b-kujira
Miniforge プロンプトで上記コマンドを実行します。
今回も LLM は『ArrowPro-7B-KUJIRA』を使います。
『ArrowPro-7B-KUJIRA』を未取得の場合は初回ダウンロードに時間がかかります。
なお、『ArrowPro-7B-KUJIRA』のサイズは 7.7GB あり、GPU の RAM も同等以上のサイズが必要です。
チャット起動した Miniforge プロンプトに「自己紹介して」と入力し、AI に自己紹介してもらいました。
タスクマネージャーを確認すると・・・。
ばっちり GPU が使われています!
5. [余談] Ollama サーバーの終了方法
Ollama サーバーを起動した Miniforge プロンプトで「Ctrl + C」を入力すると、Ollama サーバーが終了しますが、実は一部の関連プロセスが残ったままの状態になります。この状態では Ollama サーバーを再度起動しても LLM の読み込みに失敗します。3
なので少々力業ですが、私は PowerShell で次のコマンドを実行して Ollama サーバーを終了させるようにしています。
Get-Process | Where-Object {$_.ProcessName -like '*ollama*'} | kill
6. おわりに
私は AI については超初心者で分からないことだらけです。
この状態で AI を触ってみようと思ったのは Dify の存在が大きいです。
Dify を使うと私のような AI 初心者でも、生成 AI アプリをノーコードで作れたり、それを自前のサイトに容易に組み込めたり、使用する LLM も自由自在に切り替えられたりと、AI のハードルが一気に下がります。
Dify 最高です!(この記事には Dify は登場しないですけど)
7. 参考にさせていただいた情報
プロキシ環境下のローカルPCに"Dify"と"Ollama"を導入して、インターネットを通らない「完全ローカルRAGアプリ」を作る #生成AI - Qiita
https://qiita.com/yuki_ink/items/c3125f45fb725612910e
GitHub - intel-analytics/ipex-llm
https://github.com/intel-analytics/ipex-llm/tree/main
-
ArrowPro-7B-KUJIRA はベンチマーク (ELYZA-TASK100) において約 3.8(LLaMa3-70B 準拠) をマークし、7B において日本語性能世界一を達成しました。(DataPilot/ArrowPro-7B-KUJIRA · Hugging Face より転載) ↩
-
Ollama の GPU ページを確認すると、サポート対象に Intel GPU の記載がないことに気が付きました。 ↩
-
インストーラーで入れた Ollama の場合は、タスクトレイの Ollama アイコンより Ollama サーバーを終了させることができますが、この場合は残留プロセスはなく、正常に終了します。 ↩