見出し画像

Hyper-VゲストでローカルLLMを4回失敗して、ホストWindowsのOllamaに逃がした話


Hyper-V のゲスト Windows でローカルLLMを回したかった。Ollama を入れて、モデルを入れて、GPU を見に行って、だめで、またやり直して。気づいたら 4 回失敗していました。

そもそも、ゲストの中で全部やろうとしていた

やりたかったことは単純です。

Hyper-V のゲスト Windows に開発環境を置いて、その中でローカルLLMも動かす。many-ai-cli から Claude Code や Codex を起動して、モデルピッカーで Ollama Local を選んだら、そのまま手元の LLM が返事をする。

うまくいけば、かなり気持ちいい構成です。開発環境はゲストに閉じる。ホスト側は汚さない。失敗したら仮想マシンごと戻せる。

でも、現実はそうきれいにいかなかった。

Ollama は入る。モデルも入る。API もそれっぽく返る。けれど、GPU まわりで詰まる。ドライバなのか、仮想化なのか、Windows の機嫌なのか、ひとつ直したつもりで別のところが怪しくなる。

これを 4 回やった。正直、参った。

ゲストの中で全部やろうとした

そこで、考え方をひっくり返した

途中で、ふと気づきました。

ローカルLLMを「ゲストの中で動かす」必要は、本当にあるのか。

欲しいのは、ゲスト Windows の中から LLM を使えることです。Ollama のプロセスがどこで動いているかは、実はそんなに重要ではない。

だったら、GPU を持っているホスト Windows で Ollama を動かせばいい。ゲストは、その API に HTTP でつなぐだけにする。

つまりこうです。

・ホスト Windows: Ollama とモデルを持つ。GPU で推論する
・ゲスト Windows: many-ai-cli と開発環境を持つ
・ゲストからホストの Ollama API に接続する

これなら、GPU をゲストに渡す話をしなくていい。Ollama はホストの普通の Windows アプリとして動く。ゲストはただのクライアントになる。

これは効いた。

localhost を信じすぎていた

many-ai-cli 側にも、ひとつ問題がありました。

Ollama Local は、もともと `localhost:11434` を見に行く前提でした。普通にホスト OS 上で使うなら、それで正しい。Ollama も Hub も同じマシンにいるからです。

でも、Hyper-V ゲストの中で many-ai-cli を動かしていると、`localhost` はゲスト自身を指します。ホスト Windows ではない。

ここでだいぶ混乱します。

ホスト側では Ollama が元気に動いている。ブラウザや PowerShell から叩けば返る。なのにゲストの many-ai-cli から見ると、Ollama がいないことになる。

「ローカル」と言っているけど、誰から見たローカルなのか。ここを間違えると、ずっと違う住所を見に行く。

localhost を見に行く相手を変える

many-ai-cli 側には、接続先を持たせた

そこで、many-ai-cli に `ollama.base_url` という設定を足しました。

考え方は単純です。

ollama:
  base_url: "http://<host-ip>:11434"

この値を、2か所で同じように使います。

・モデル一覧を取るときは `<base_url>/api/tags` を見る
・Claude Code や Codex を Ollama route で起動するときは、子プロセスに `<base_url>` を渡す

Codex は OpenAI 互換 API として見るので、内部では `/v1` を足します。Claude Code は Anthropic 互換 API として見るので、`/v1` は足しません。

このあたりを設定ファイルに寄せたことで、ゲストからホストの Ollama を自然に使えるようになりました。モデルピッカーにもホスト側の pull 済みモデルが出る。起動した Codex も、ゲスト内の空っぽの localhost ではなく、ホスト側の Ollama に向かう。

地味だけど、これでやっとつながった。

Firewall はちゃんと絞る

この構成でいちばん気をつけるのは、Ollama API を外へ開けすぎないことです。

ホスト Windows 側の Ollama は、ゲストから届くように待ち受けを広げる必要があります。ただし、インターネットに出すものではない。

やることは、だいたいこのあたりです。

・Ollama をホストのネットワークインターフェイスで待ち受ける
・Windows ファイアウォール で Hyper-V のゲスト側ネットワークだけ許可する
・ルーターのポート転送はしない
・ゲスト側から疎通確認して、many-ai-cli の `ollama.base_url` を設定する

ここは「動けばいい」で雑にしないほうがいいです。LLM の API は、手元の道具として使うぶんには便利だけど、外から誰でも叩ける場所に置くものではない。

ゲストで全部やる、を諦めたら楽になった

最初は、ゲストの中でローカルLLMまで完結させるのがきれいだと思っていました。

でも、今回の感覚だと、開発環境と推論環境は分けたほうが楽でした。ゲストは壊しても戻せる作業場。ホストは GPU を持っている推論係。間は HTTP API でつなぐ。

分けると、考えることも分かれます。

・開発環境を整える話
・GPU で推論する話
・API の向き先をそろえる話

ごちゃっと一つに押し込むより、ずっと見通しがよかった。

学んだことは、このくらいです。

・`localhost` は、いま動いている側から見た自分自身
・GPU を仮想マシンに持ち込むより、API 越しに借りるほうが早いことがある
・設定値は、モデル一覧取得と実行時 env の両方で同じものを使わないとズレる
・ネットワーク越しにするなら、Firewall の範囲は必ず絞る

4回失敗したあとに書くと、妙に身にしみます。

締め

今回は、Hyper-V ゲストでローカルLLMを動かすのをいったん諦めました。

諦めたというより、置き場所を変えた。LLM はホスト Windows の GPU に任せる。ゲストは API を叩く。many-ai-cli は、その接続先を設定できるようにする。

こういう「全部ここでやる」をやめる判断、個人開発でもけっこう大事だなと思いました。

また似たところで詰まったら、まず「本当に同じ箱に入れる必要があるのか」を疑うところから始めます。小さく。動く形から。

次回記事


※ ヘッダー画像は AI(画像生成)で作成しています。

書いた人: ishizakahiroshi
群馬の北部で、保護猫2匹と暮らす、在宅エンジニア(何でも屋)

https://github.com/ishizakahiroshi

X(業務委託・各種相談はこちら)

バックエンド・インフラ・AI連携まわりで、業務委託のご相談を受け付けています。フルリモートです。スポットや週2〜3時間からでも歓迎で、いろんな案件に携われたらうれしいです。こんな相談、歓迎です。

いいなと思ったら応援しよう!