はじめに
リモートで仕事をする家の環境をMac上で整備しているので、ローカル環境下でのLLM実行環境もMac上に構築していました。
ただ、社内では弊社情シスの方針でMacが使えず、基本的にWindows端末しかありません。先日、3DCAD用にそれなり(中の上程度のスペックで古い...今年の4月に購入しているのに...)のグラボを載せたWindows端末へLLM実行環境を導入できる?という話になり、少し調べた内容を忘れないうちにメモに残そうかと思います。
方針は以下のとおりです。
- WSL内に構築したローカル環境下で実行できる(Ollama+Open WebUI)
- Python環境の仮想化にuvを使う
- 同じネットワーク内にある他の端末からも利用できる環境にする
WSLのアドレスはWindowsのそれと違う番号が割り当てられるので、Windows上でのポートの解放、ポートフォワーディングを設定後、Windowsを通過してWSL内で走るOpen WebUIへつながるようにします。
WSLの導入
WSLはすでに導入済とということで諸々の手順は割愛します。
PowerShell上で下記のとおり実行します。
> wsl.exe -d Ubuntu
Ollamaの導入
WSLにOllamaを導入します。
$ curl -fsSL https://ollama.com/install.sh | sh
ちゃんと動くか、小ぶりのモデルを突っ込んで試用します。
$ ollama pull gemma3:270m
...略...
$ ollama run gemma3:270m
>>> 日本の首都に関して教えて
日本の首都は、**東京**です。
>>> /bye
ちゃんと動いたようなので、次に進みます。
Open WebUIの導入
Open WebUIの導入するために、uvで仮想環境を用意します。
まず、uvを落としてきて突っ込みます。
$ curl -fsSL https://astral.sh/uv/install.sh | sh
...略...
$ uv self version
uv 0.9.14
uvで仮想環境を用意します。
$ uv init --python 3.11 venv-ow
$ uv venv --python 3.11
その仮想環境内に、Open WebUIを導入します。
ちゃんと導入できると、サクッと実行できます。
$ uv add open-webui
$ uv run open-webui serve
ここまでの手順をサラサラっと終えると、WSLで実行中のOpen WebUIへ本体のWindowsからブラウザを介してアクセスすることができます。なお、Open WebUIのアップデートの手順は以下のとおりです。
$ uv lock --upgrade
$ uv sync
今回、新たな気づきが多かったのは、以降の話題でした。
Windowsのファイアーウォールの設定
まず、Windows Defender ファイアウォールで、ネットワーク上の他の端末からWSLが走るWindowsへの通信を許可します。
Open WebUIとのやり取りに使うポート8080に対して行います。
以下、作業の流れです。
- ウィンドウ左側の詳細設定を選択
- 詳細設定で開いたウィンドウ左側の「受信の規則」を選択、右側の「新しい規則」を選択
- 新しい規則を作るウィンドウ内の「規則の種類」から「ポート」ラジオボタンを選択、「次へ」をクリック
- 通信の種類から「TCP」と「特定のローカルポート」ラジオボタンを選択、「8080」を入力後、「次へ」をクリック
- 「接続を許可する」ラジオボタンを選択、「次へ」をクリック
- プロファイルから「プライベート」と「パブリック」チェックボタンを選択、「次へ」をクリック、設定名を入力、「完了」で終了
プロファイルですが、無線LANでつなげている環境なら「パブリック」をチェックしておかなないと、期待どおりの動作をしません。有線・無線にかかわらず、外部の通信環境を使っていなかったら全部「プライベート」やろ!と思っていましたが、そうではないようです。今回、一番悩んだところでした(一番くだらないところで...)。
新しい設定がちゃんと動いているかは、以下で確認できます。
> Get-NetFirewallRule -DisplayName "<保存した規則名>"
ポートフォワーディングの設定
ポートを開けたので、Windowsのアドレスへの接続をWSLのアドレスへ転送(ポートフォワーディング)する設定を行います。WSLのアドレスは起動時に表示されますが、以下のコマンドでも確認できます。
$ ip addr
同様に、WindowsのアドレスはPowerShell上で以下のコマンドを実行すると確認できます。
> ipconfig /all
それぞれのアドレス名が分かったところで、以下のコマンドを実行します。
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=***.***.***.***
「listenaddress」にWindowsのアドレス、「connectaddress」にWSLのアドレスを指定します。なお、「listenaddress」は0.0.0.0で良いとのことです(せっかく調べましたが)。
ちゃんと設定できているかは、以下のコマンドで確認できます。
> netsh interface portproxy show v4tov4
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
0.0.0.0 8080 ***.***.***.*** 8080
以上で、諸々の設定が終了です。正しく設定できていると、Windows内のWSL環境下で実行中のOpen WebUIに他の端末からアクセスして、生成AIを使うことができます。
まとめ
Windowsは設定が色々難しいです...
こんな煩雑な設定が求められるのに皆さん難なく使いこなしているので、素直にすごいなぁと思います。
参考にさせていただいたリンク一覧
-
WSL 上の Linux でホストしているサーバーに外部端末からアクセスする方法
https://mseeeen.msen.jp/connect-to-wsl-hosted-server-from-external-devices/ -
"Listen Address"の0.0.0.0と::は何のことか | Reflection for Secure IT
https://tooljp.com/qa/ListenAddress-RSIT-4D4E.html