Practice of Programming

プログラム とか Linuxとかの話題

Local LLMを試してみた(Radeon => NVIDIA)

この記事は、8ヶ月か前に下書きしていたものを少しだけアップデートしたものです。情報としてはあまり新しくありませんが、Local LLMをお気軽に試したい人には特に問題ない内容かなと思います。Advent Calendarのネタがないので、引っ張り出してきました。

8ヶ月前くらい(2025年4月くらい)のAIのコードは正直全然信用できなくて、クラウドサービスを使うべきとは思いつつ、信頼できないものにお金が流れていくのも嫌な気分になるので、Local LLMなら、電気代以外は固定費用なのでまぁ、いいかという気分でやってみました。

最初に結論を書くと、用途によっては使えそうだけど、ケチらないほうが良さそうだ。ということがわかりました。安物買いの銭失いというやつですね(いや、そんなに安くはないんだけどね...)。

なお、現在は、Claude Codeを常用していて、Local LLMは全然使っていません。

最初にやったこと

Rustでコードを書くのに手持ちのPCが非力だったので以前にPCを買っていました。とはいえ、Mini PCで以下のようなスペックです。

  1. Mnisforum UM890 Pro
  2. OSはWindows 11 pro

ここ数十年、Linuxしか使ってないのですが、UM890 ProはWindows 11 Proだし、あえてWindowsで使ってみようというということで、そのままにしていました。WSLもあるし。 Local LLMはLinuxで動かしたほうがパフォーマンスは良いようですが、一旦試すのは、Windowsのままでやりました。

GPUは、書いての通りNVIDIAではありませんが、一応試すことはできます。

Local LLMというのはどうやって動かすのか?

全然知らなかったので、ChatGPTに聞いてみたところ、Ollamaというソフトウェアを使うといいらしいということがわかりました。ただ、NVIDIAではないので、ちょっとだけ、めんどくさかったです。

以下の、780Mがファイル名に入っている(お持ちのGPUによります)、rocm.gfx1103.AMD.780M.phoenix.V5.0.for.hip.sdk.6.2.4.7z をダウンロードします。

github.com

  1. ROCmを入れる
  2. 先程ダウンロードしたファイルで、ROCmのファイルを上書きする

チャットとして使ってみる

チャットとして使う分には、コマンドラインから、ollama run モデル名 とすることで、チャットができます。チャット用途なら遅いけれど使えなくはなかったです。

モデルをダウンロードするだけなら、ollama pull モデル名とします。

RooCodeでAgentとして使う

無理でした。エラーが出まくります。ただ、モデルの選択が悪かった可能性もあります。

ハードウェアを追加

はい。GPUを買いました。UM890 Proには、Oculinkというインターフェースを付けられるので、そこから、eGPU(外付けGPU)を追加することにしました。

  1. DEG1 ... minisforumから出ている外付けのGPUキット。電源とGPUを付ける土台ですね
  2. RTX 3090 ... VRAM24G。中古です
  3. CORSAIR RM850e ... 850Wの電源

ちなみに、機器選定についても、ChatGPTに聞きました。RTX 3090は、おすすめされていなかったのですが、4090は高いし、メモリは同じ24Gなので、まぁ、いいかというところで、RTX 3090としました。

個人でグラボとか電源とか買ったの大学生ぶりくらいじゃない?と思いつつ、コネクタ等はちゃんとハマるところにしかハマらないようになっているので、特に説明とかを読む必要もなく接続できました。

Ocluinkのケーブルも買ったのですが、DEG1に付属していたので、買う必要がなかったです。そして、買ったやつは認識してくれなかったので返品しました。

見た目は、こんな感じになりました。

DEG1は電源とグラボを金具で接続するので、グラグラしたりはしないですが、むき出しなので、ちょっと気を使いますね。スタンディングデスクの下においているので、うっかり飲み物とかをこぼすと危険。

なお、BitLockerで暗号化しているのですが、OculinkでeGPUをつなぐと、回復キーの入力が求められました。Oculinkを外した場合も、回復キーの入力が求められました。BitLockerを使っていると、付け外しはちょっとめんどくさいですね(稼働中の付け外しは厳禁です)。BigLockerの回復キー長いし。もっと短くても良くない?っていつも思う。

再度、Ollamaを使ってみる

NVIDIAのドライバをインストールして、Ollamaも再インストールしました。

うってかわって、軽いモデルなら爆速になりました。ChatGPTやGemini使うよりも全然速いです(8ヶ月前比)。まぁ、品質はモデルに依るので、イマイチなときももちろんあります。

モデルによっては、なかなかぶっ飛んでるのもいました。狂信者みたいな返答をしてくる(何のモデルかは忘れました)。

RooCodeを使ってみる

当初の目的のコーディングエージェント、RooCodeで使ってみました。が、いろんなモデルを試しまくったものの、最初は全然だめでした。途中でエラーになったり、同じことを繰り返したりしてまったく使い物になりません。

検索したところ、微妙に動くものを見つけました。 Redditで紹介されていた、hhao/qwen2.5-coder-tools:32b

このモデルだと、動きはしました。が、遅いですし、タスクによっては同じことを繰り返し続けたりはします。任せるタスクに依るという感じですが、あまり使いものはならなかった。

Kilo Codeを使ってみる

mychen76/qwen3_cline_roocode:8b という割と小さめのモデルで使ってみました。コンテキストサイズは128Kを指定してみました。

Roo Codeでは、エラーになってうんともすんともでしたが、とりあえず、動いているようです。が、めちゃくちゃ遅いのと、最終的にはやはり動かなくなりました。ちょっと読ませるコード量が多すぎたかもしれません。

AIにコードを書かせるなら、Local LLMに限らずですが、1ファイルは小さくしたほうが良いですね。

Gooseを使ってみる

block.github.io

Gooseは、デスクトップとCUIがあります。 デスクトップで使ってみましたが、あまりうまくいきませんでした。

qwen2.5 Corder 32B instruct で、contextを16Kくらいでなんとか動いたり、動かなかったり。 最初、全然ツールを使ってくれなくて、ログの出力を、Detailedにしたら使うようになりました。 なんでやねん。

いずれにせよ、同じ命令を繰り返したりしますね。

やはりスペックが足りないのか。

LibreChatを使ってみる

ollama run モデル名コマンドラインからチャットをするのは不便なので、LibreChatを使ってみることにしました(LM Studio使えばチャットできますけどね)。LibreChatはChatGPTライクなインターフェースのチャットアプリです。Dockerでも動きます。

Ollamaを使うためには、少し設定が必要です。なお、Ollamaのバージョンは、0.13.1です。LibreChatのバージョンは、0.7.8です。

cp librechat.example.yaml librechat.yaml

customのところに追加します。

    - name: "Ollama"
      apiKey: "ollama"
      baseURL: "http://127.0.0.1:11434/v1/"
      models:
         default: [
           "llama2",
           "gemma3",
           "mistral",
           "codellama",
           "dolphin-mixtral",
           "mistral-openorca"
           ]
         fetch: true
      titleConvo: true
      titleModel: "current_model"
      modelDisplayLabel: "Ollama"
      capabilities: ["execute_code", "file_search", "actions", "tools"]

modelsはの、defaultは空でも良いはずです。

docker-compose.ymlに以下のように、上で作ったlibrechat.yamlをvalumesに加えます。

diff --git a/docker-compose.yml b/docker-compose.yml
index e16f93f4..c6b0fd95 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -27,6 +27,9 @@ services:
       - ./images:/app/client/public/images
       - ./uploads:/app/uploads
       - ./logs:/app/api/logs
+      - type: bind
+        source: ./librechat.yaml
+        target: /app/librechat.yaml
   mongodb:
     container_name: chat-mongodb
     image: mongo

.env に、以下を追加します。

CONFIG_PATH=/app/librechat.yaml

これで、docker-compose up -d すれば、http://127.0.0.1:3080/ でアクセスできるようになります。

ユーザー登録が必要ですが、多分ローカルに保存されるだけなので、気にせず登録すればよいかと思います。 また、LAN内とかで使うのであれば、下記の設定もしておいてもよいかと思います。

BAN_VIOLATIONS=false

もともとtrueですが、falseに変更すれば、利用制限やログイン失敗等で、BANされなくなります。

クラウドサービスのAPIとかも登録できるので、サービスやモデルを切り替えて使いたい人にも便利かもしれません。

なお、Ollamaで新しいモデルをpullした場合は、LibreChatの再起動をしないとモデルの選択項目に現れなかったので、注意してください。

LibreChatをOllamaが動いているPCと別で動かす場合

Ollamaは127.0.0.1:11434をlistenしているので、設定を変える必要があります。 環境変数OLLAMA_HOST0.0.0.0:11434か、そのPCのIPとお好きなポートを設定してやれば良いです。

benchllamaの結果(Windows)

becnhllamaというツールでベンチマークが取れるので、phi4hhao/qwen2.5-coder-tools:3でとってみました。

~/.local/bin/benchllama evaluate --samples 50 --models phi4 --models hhao/qwen2.5-coder-tools:32b --provider-url http://127.0.0.1:11434 /

Ollama をWSL2で動かす

Windowsで動かすよりも、WSL2で動かしたほうが速いらしい。Linux直で動かすのが一番よいようですが、WSL2でもいい感じらしいので、そちらでも動かしてみました。

サービスの設定

/etc/systemd/system/ollama.serviceに、Environment="0.0.0.0:11434" を書きます。 ※ ただし、Ollamaを再インストールすると上書きされます

そして、サービスを再起動しましょう。

sudo service ollama restart

以下のようになっていればOKでしょう。

% sudo ss -tulnp |grep 11434
tcp   LISTEN 0      4096                *:11434            *:*    users:(("ollama",pid=5102,fd=3))                      

Networkの設定

PowerShellで以下を実行することで、WSL上で動いているollamaにホストからアクセスできます。

netsh interface portproxy add v4tov4 listenport=11434 listenaddress=0.0.0.0 connectport=11434 connectaddress=[wslのIPアドレス]

wslのIPアドレスはWSL上でip addr|grep 192 とでもすればわかります。

他のPCからアクセスする場合は、WindowsFirewallの設定を行って、11434へのアクセスを許可してください。

上記のように設定することで、他のPCからもアクセスできます。

WSL2で動かした場合のbenchllamaの結果

微妙に遅いです...ね。

WindowsとWSL2でOllamaのモデルを共有したい

Windowsのモデルを共有する(無理)

WSL2では、/usr/share/ollama/.ollama/ 以下にデータがあるので、WSL2から/mnt/C/Users/ユーザー名/.ollama のsymlink作れば良いんじゃないかと思いました。要は以下をしたわけですが

sudo systemctl stop ollama.service
cd /usr/share/ollama
sudo mv .ollama .ollama.back
sudo ln -s /mnt/C/Users/ユーザー名/.ollama .
sudo systemctl start ollama.service

が、とても重くなってしまいました。一回読み込んだら速いかなぁと思ったのですが、そうでもなく、遅いままでした。使えませんね。

WSL2のモデルを共有する(微妙)

環境変数OLLAMA_MODELSを指定すれば良いです(Linux環境変数を使っても良いです)。以下のようなパスを環境変数に設定してあげれば良いでしょう。

\\wsl.localhost\Ubuntu-22.04\usr\share\ollama\.ollama\models\

ちなみに、mklink でリンクを作るのはうまく行きませんでした。

パフォーマンスは、特に変わらずという感じでしたので、WSL2からもWindowsからも試したいという人は、WSL2のモデルのパスをOLLAMA_MODELSに指定すると良いでしょう。

ちなみに、その前に、benchllamaで計測したところ、激重になっていてなんでやろと思ったら、Radeonを使うようになっていました。意図せずして、Radeonのパフォーマンスを計測することができました。

雲泥の差ですね。

ただ、うまく行かないことも多かったので、素直にそれぞれの環境にモデルをダウンロードすべきかと思います。

LM Studioを使ってみる

Ollama以外にも、LM Studioというソフトウェアがあります。こちらのほうがGUIがあり、簡単に扱えます。

lmstudio.ai

LM Sttudio であればサーバを有効にするには、以下の設定を有効にします。

Server Portは、デフォルトでは、1234ですが、Ollamaを停止して、同じポートにしました(諸々の設定をしなくて済むので)。

他のPCから使うのであれば、Serve on Local Network を on にして、Status Stopped のスイッチをオン(画像はスイッチがオンなので、Status Runningとなっています)すればよいです。簡単。

Context lengthを追加する場合は、ファイルのタブから、それぞれのギアアイコンから設定できます。

Roo Codeや、Kilo Codeにも LM Studio の設定が存在するので、簡単に使えます。

Gooseに関しては、Add Custom Providerで、OpenAI Compatibleとして、登録すればよいです。

LM Studio はGUIがあるので、モデルの検索、ダウンロード、ロードするモデルのコンテキストの調整などが手軽にできるのは便利です。

終わりに感想

色々試しましたが、コーディングエージェントとしての実用性はちょっと厳しいですね。

ASUS Ascent GX10 を買うしか無いかも。