Continue 拡張機能を使う


はじめに

自分は日曜エンジニアである。たまにコードを書くが、github copilot による補助を強く受けている。もうほぼ github copilot が書いていると言ってもいい。見もせず tab キーを押すだけの生活をしている。

MacBookPro を買い替えた。結果、ローカルで LLM が動くようになった。もしかして、ローカル LLM を使えば github copilot を代替することができるのではないか、という期待を持ち、試してみることにした。

動いたら月 10 ドル浮くのは大きい。もっとも、その皮算用でクソ高い MacBookPro を買ったので、むしろ代替して元を取らねばならない。

環境

  • MacBook Pro (14-inch, 2024)

  • macOS Sequoia 15.2

  • Apple M4 Max

  • 128GB RAM

実はここの環境が非常に重要で、おそらく上記環境より性能が低い場合は試してもうまく動かないことが予想される。

そして、このスペックで購入する人がこの程度の記事の内容に自力で到達できないはずもなく、もはやこの記事が誰に向けたものなのかは非常に謎だ。

また、Apple Silicon 搭載 Mac においては RAM と VRAM が共有なので RAM の量が物を言うが、Windows においては必ずしもこの限りでない。VRAM を使用してモデルをロードし、GPU を使用してモデルを動かすため、その二つが重要だ。ローカル LLM を動かす PC を買う場合、一般的な PC 選びの基準とは乖離した基準で選ばねばならない。

Ollama

Ollama のインストール

前提として、Ollama が必要である。

https://ollama.com/

ターミナル上で実行する Ollama はデスクトップアプリケーションで、ターミナル上で対話形式で LLM と対話できるほか、ローカル API サーバーを実行できるのが特徴だ。これにより、他のアプリケーションから Ollama が管理している LLM にアクセスすることができる。

実行する LLM は自分で探さないといけないが、Ollama で実行できるモデルは全て Ollama のサイトにある。

例えば phi4 が気になる場合、ターミナルを開いて以下のように実行する。

ollama run phi4

これで phi4 をローカルで動かすことができる。

試しに実行してみた。良さげだ。

hogehoge@MacBook-Pro hogefolder % ollama run phi4
>>> 今日は!
こんにちは!今日はどのようにお手伝いできるか、何でもご相談ください。何をしたいですか?

>>> Send a message (/? for help)

モデルのカスタマイズ

モデルはそのままでも使えるは使えるのだが、モデルの受け入れ可能文字数とは別に Ollama が実際に受け入れる文字数が決まっている。それを拡張しないと、文章の一部しか読まずに適当に返すバケモンになってしまうので拡張する。

適当に文字数としているが、単語数かも。違ったらすみません。

以下のパスに.ollama 隠しフォルダがあるので、vscode で開こう。

/Users/ユーザ名/.ollama

以下のコマンドでターミナルから開けそうだが、自分はダメだったのでダメだった人は finder で探してくるなりなんとかしてほしい。ユーザ名は人によって違う。

code /Users/ユーザ名/.ollama

開いたら、ルートディレクトリ直下にカスタマイズ用のファイルを作ろう。

phi4

まずは phi4 から。ターミナルから一旦元のモデルをダウンロードする。

ollama pull phi4

そして、適当な名前でカスタマイズファイルを作ろう。拡張子だけ.Modelfile にする必要がある。

(phi4-cline.Modelfile)

FROM phi4:latest

PARAMETER num_ctx 16384

あとはターミナルで新モデルを作成するだけだ。
以下のコマンドを実行するのだが、この Modelfile を右クリックしてパスをコピーして、-f 以降に貼り付けるとよい。

ここで使うモデル名が後々設定ファイルに書くモデル名になる。

ollama create phi4-cline:latest -f /Users/ユーザ名/.ollama/phi4-cline.Modelfile

これでモデルが作成される。以下同様に作成していこう。

llama3.3

ollama pull llama3.3

(llama3.3-cline.Modelfile)

FROM llama3.3:latest

PARAMETER num_ctx 16384
ollama create llama3.3-cline:latest -f /Users/ユーザ名/.ollama/llama3.3-cline.Modelfile

codellama:13b-code

ollama pull codellama:13b-code

(codellama-enhanced-13b.Modelfile)

FROM codellama:13b-code

PARAMETER num_ctx 16384
ollama create codellama-enhanced:13b-code -f /Users/ユーザ名/.ollama/codellama-enhanced-13b.Modelfile

snowflake-arctic-embed2

ollama pull snowflake-arctic-embed2

(snowflake-arctic-embed2-enhanced.Modelfile)

FROM snowflake-arctic-embed2

PARAMETER num_ctx 8192
ollama create snowflake-arctic-embed2-enhanced -f Users/ユーザ名/.ollama/snowflake-arctic-embed2-enhanced.Modelfile

お疲れ様だ。休憩をして次に進むのをお勧めする。

Continue 拡張機能のインストール

以下からダウンロードし、VSCODE にインストールしよう。VS Code じゃなければ知らん。他にも対応 IDE があるっぽいので、調べてほしい。

https://marketplace.visualstudio.com/items?itemName=Continue.continue

できたら起動し、設定していく。

設定

左側のタブの中から Continue を選択し、開く。

開くと、右上の方に歯車マークがある。ここで config.json を編集する。

JSON ファイルの書き方に関しては自分でググってほしい。

面倒なので、自分の現在の config.json を貼り付ける。最悪読めなくても config.json の中身を全て以下のように上書きすれば次に進める。

{
  "models": [
    {
      "title": "phi4-cline:14b",
      "provider": "ollama",
      "model": "phi4-cline"
    },
    {
      "title": "llama3.3-cline:70b",
      "provider": "ollama",
      "model": "llama3.3-cline"
    }
  ],
  "tabAutocompleteModel": {
    "title": "codellama-enhanced:13b-code",
    "provider": "ollama",
    "model": "codellama-enhanced:13b-code"
  },
  "tabAutocompleteOptions": {
    "debounceDelay": 0,
    "maxPromptTokens": 16384,
    "multilineCompletions": "always"
  },
  "embeddingsProvider": {
    "provider": "ollama",
    "model": "snowflake-arctic-embed2-enhanced"
  },
  "contextProviders": [
    {
      "name": "code",
      "params": {}
    },
    {
      "name": "docs",
      "params": {}
    },
    {
      "name": "diff",
      "params": {}
    },
    {
      "name": "terminal",
      "params": {}
    },
    {
      "name": "problems",
      "params": {}
    },
    {
      "name": "folder",
      "params": {}
    },
    {
      "name": "codebase",
      "params": {}
    },
    {
      "name": "search"
    },
    {
      "name": "url"
    },
    {
      "name": "clipboard"
    },
    {
      "name": "tree"
    },
    {
      "name": "problems"
    },
    {
      "name": "debugger",
      "params": {
        "stackDepth": 3
      }
    }
  ],
  "slashCommands": [
    {
      "name": "share",
      "description": "Export the current chat session to markdown"
    },
    {
      "name": "cmd",
      "description": "Generate a shell command"
    },
    {
      "name": "commit",
      "description": "Generate a git commit message"
    }
  ],
  "allowAnonymousTelemetry": false
}

説明する。まずは、models の部分を見てほしい。この部分はチャットに用いる言語モデルの設定だ。複数登録することができる。

"models": [
    {
      "title": "phi4-cline:14b",
      "provider": "ollama",
      "model": "phi4-cline"
    },
    {
      "title": "llama3.3-cline:70b",
      "provider": "ollama",
      "model": "llama3.3-cline"
    }
  ],

とりあえず、phi4 と llama3.3 をベースにしたカスタマイズモデルを利用する設定にしている。title は表示名、model は実際のモデル名だ。

"tabAutocompleteModel": {
    "title": "codellama-enhanced:13b-code",
    "provider": "ollama",
    "model": "codellama-enhanced:13b-code"
  },
  "tabAutocompleteOptions": {
    "debounceDelay": 0,
    "maxPromptTokens": 16384,
    "multilineCompletions": "always"
  },

こちらはコード補完の方のモデルだ。コード補完で用いる言語モデルは特殊な訓練を受ける必要があるため、モデルがコード補完に対応しているか慎重に確認する必要がある。例えば、codellama:13b はコード補完ではなくコード説明やコード生成に向けたトレーニングをされたモデルで、codellama:13b-code がコード補完に向いているモデルである。これに気づかず自分は無駄な時間を費やした。

tabAutocompleteOptions の中身は、コード補完に関する設定だ。

multilineCompletions は複数行の補完を可能にするかどうかで、デフォルトは auto なのでいじる必要はないのだが、楽をしたいので always にしてみた。
debounceDelay は補完の遅延時間を指定する。これ必要か?

maxPromptTokens は使用するプロンプト トークンの最大数らしいがよくわからないのでとりあえず 16384 を入れておく。codellama:13b-code のコンテキスト長そのままにしてある。おまじない。

"embeddingsProvider": {
    "provider": "ollama",
    "model": "snowflake-arctic-embed2-enhanced"
  },

こちらは、チャットでコードベースで質問をする際に参照するベクトルデータベースを作る際のモデルだ。フォルダ全体を読んで、内容を整理してデータベースに格納してくれる。だが、いまいち正解を見つけられていない。全然コードを読めていないのだ。逆に自然言語は結構得意なようで、Obsidian で日記を書いているのだが、それを保存しているフォルダを読ませたところかなり正確に情報を取得できる。

Continue 公式がおすすめしている voyage-code-3 も nomic-embed-text も含めて試したものは全て特定の React コンポーネントがどこから呼び出されているかと言う程度の質問に答えられなかったので、多分このタスク自体が難しいのだと思う。

再ランキングモデルに関しては、よくわからない。Continue 公式によると Ollama 側が再ランキングモデルを置いていないらしく、Ollama 対応していないのでとりあえずスルーして良い。

動きました?

これで 設定自体は終わった。

一応これで動くはずなのだが、性能が足りなかったり、多少ミスがあると動かないことがある。

また、動かしながらメモリ消費を見守ってみてほしい。コード保管だけで 64GB 近くメモリを消費する。「あれ、codellama:13b って 7.4GB じゃなかった?」と思うはずだが、残念ながらそれはモデル自体のサイズでしかなく、特に num_ctx を拡張しているため、実際に使用するメモリは読む文字が増えた結果雪だるま式に増えている。

llama3.3 に至っては、128GB メモリの MacBookPro ですら 9 割近く食べる。「メモリは 16GB あれば十分」な時代はとうの昔に終わったんだなと思わされる。

終わりに

MacBookPro に RAM128GB が載った上で、llama3.3 が現実的なサイズで出てきたおかげでローカル LLM の実運用に現実味が発生し始めたような感覚がある。

正直なところ、この方法で github copilot をするために高価な MacBookPro を購入するのはかえって費用がかかる。chatGPT と github copilot を 3 年使ってトントンくらいにはメモリを盛るのに金が飛んだ。だったらそれらを 3 年使ったほうが良くないですか、と言う話になる。

だが、Ryzen AI は 128GB 統合メモリのうち最大 96GB VRAM 割り当てが可能になる予定で、これであれば本記事の内容を Windows でも実現できそうだし、5 月発売を予定している NVIDIA Digit は Linux ベースの OS だが、128GB 統合メモリと高性能な GPU 性能を備えており、より高速に llama3.3 をローカル動作させられる PC になりそうだ。

128GBで3年くらい足りてほしいけどすっごい不安なんだよなぁ

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