最近、グラボを新調しました。
コード補完レベルなら動くっぽいので試してみました。
スペック
※PC本体は3年ちょっと前に買ったやつ
| パーツ | スペック |
|---|---|
| CPU(未換装) | AMD Ryzen 5 4500 |
| RAM(増設) | 32GB |
| グラボ | AMD Radeon RX 9600 XT(16GB) |
準備
しろーとなので、少ない手順で動かせそうな LM Studio を使います。
入れたバージョンは 0.4.14 でした。
使うモデルは、コード補完目的なので qwen2.5-coder-14b-instruct の Q4_K_M にしてみます。ダウンロードサイズは 8.99GB。
コード補完目的なら古くてもコード特化モデルがいいよ、と ChatGPT さんが言ってました。
チャット機能は低め、らしい。
保存先の変更
デフォルトではダウンロードしたモデルはCドライブに入ります。
M2をケチってて容量がそんなにないので、Dドライブ(HDD)の方に保存するようにしました。
モデルのロードにけっこうかかりそうですが仕方ない。
- 左のメニューバーから
My Modesを選択 - 右下の「...」をクリック
- 表示されたメニューの
Change...を選択
モデルのダウンロード
- 左のメニューバーから
Model Searchを選択(My Modelsのひとつ下) -
Qwen2.5-Coder-14B-Instruct-GGUFで検索 -
Lmstudio-communityの方をダウンロード- たんに一番上に表示されたので...
その他設定
グラボが Radeon なので、CUDA は使えません。ROCm と Vulkan が使えるようですが、ChatGPT さんが Vulkan の方を薦めたのでとりあえずこちらで。
初期値 Vulkan でしたが、以下の手順で設定できます。
- 左のメニューバー一番下の歯車アイコンを選択
- System > Runtime で Runtime Selections > GGUF から
Vulkan llama.cpp (Windows)を選択- v2.16.0 らしいです(llama.cpp のバージョン?)
モデルのロード
- 左のメニューバー
Developer(My Modelsのひとつ上) を選択 - まんなかの列上の方に
+ Load Modelボタンがあるのでここから - ロードが終わったら、
Status: Stoppedの横のトグルをONにするとアクセスできるようになる
ロードすると、RAMが8GBくらい、VRAMが9GBくらい消費しました。
かかった時間は2分くらい。HDDでもいけますね。
他のアプリケーションも動かすなら、RAM 24GB・VRAM 12GB くらいでギリだと思います。RAM 32GB・VRAM 16GB は良い選択じゃった。
VSCode の設定
コード補完目的なら Continue がよさそうなので拡張機能を入れました。
設定ファイル内容は以下のかんじ(ChatGPTが示したJSONを手動でYML形式にして追記)。
Local QwenCoder のところが追記箇所です。
name: Local Config
version: 1.0.0
schema: v1
models:
- name: Llama 3.1 8B
provider: ollama
model: llama3.1:8b
roles:
- chat
- edit
- apply
- name: Qwen2.5-Coder 1.5B
provider: ollama
model: qwen2.5-coder:1.5b-base
roles:
- autocomplete
# ↓ 追記箇所
- name: Local QwenCoder
provider: openai
model: qwen2.5-coder-14b-instruct
apiBase: http://localhost:1234/v1
apiKey: "lm-studio"
roles:
- autocomplete
- edit
# ↑ 追記箇所
- name: Nomic Embed
provider: ollama
model: nomic-embed-text:latest
roles:
- embed
コード補完お試し
ChatGPT に補完元ネタを出させてやってみました。
こいつ...動くぞ...!
TypeScript
type User = {
id: string;
name: string;
};
export async function getUser(id: string)
※最後の)を手打ちすると補完が出てくる
補完後
type User = {
id: string;
name: string;
};
export async function getUser(id: string): Promise<User> {
// Simulate fetching user
ちょっと書き換え
type User = {
id: string;
name: string;
};
export async function getUser(id: string): Promise<User> {
return await f
補完後
type User = {
id: string;
name: string;
};
export async function getUser(id: string): Promise<User> {
return await fetch(`https://api.example.com/users/${id}`)
おー、ちょっとすごい。実務で使えるかは別。
Golang
package main_test
func Sum(a, b int) int {
return a + b
}
func TestSum(t *testing.T) {
まで書いて、1行ずつ補完させていって最終的に
package main_test
func Sum(a, b int) int {
return a + b
}
func TestSum(t *testing.T) {
result := Sum(2, 3)
if result != 5 {
t.Errorf("Expected 5, got %d", result)
}
}
まぁまぁ。
ちなみに、補完が走ると GPU の計算をちょっとだけしてる。
VRAM 使用量もほぼ増えないので、もうちょい重い処理もできそう感ある。
Golang: editモード
もうちょいできそうなので、autocomplete だけでなく edit もやってみた。
元コードはさっきと同じ。
package main_test
func Sum(a, b int) int {
return a + b
}
func TestSum(t *testing.T) {
最終行を選択して Ctrl+I、チャット入力欄にadd testcodeと入力してEnter。
(日本語入力だとなんも起きないことがあったのでそれっぽい英語で指示...)
package main_test
func Sum(a, b int) int {
return a + b
}
import "testing"
func TestSum(t *testing.T) {
result := Sum(2, 3)
if result != 5 {
t.Errorf("Expected %d, got %d", 5, result)
}
}
おー、すごいじゃん。
計算余力はまだありそう。
感想
edit モードのプロンプトを色々試せればちょっと楽できるかも?
入力も出力も短いというのはありますが、9600 XT でもローカルLLMがストレスないくらいの速度で動くのは ちょーすごい ですね。
今のところ100%人力コーディングなので、いい加減触って慣れていかないとなと思いました。
あと、Continue がたたくエンドポイントを自作すれば人工無能レベルでいろいろできるかもとも思いました。
