Closed13

VS Codeからllama.cpp/Code Llamaを使う(Continueプラグイン)

kun432kun432

TL;DR

Llama.cppでCode Llamaが使えるようになったので、VS Codeから使ってみる。copilot的なやつ。

https://zenn.dev/kun432/scraps/c629c0f0a49a69

https://zenn.dev/kun432/scraps/d532830c0f2260

前提

  • llama.cppはLAN内のサーバで動かす
    • 理由
      • VSCodeを動かすマシンがやや非力なので、同じマシン内でLLMを動かしたくない
      • GPUオフロードして高速に生成させたい
    • サーバ側スペック
      • CPU: Intel Core i9-13900F
      • メモリ: 96GB
      • GPU: NVIDIA GeForce RTX 4090 24GB
  • モデルはcodellama-34b-instruct.Q4_K_M.ggufを使う
    • cuBLASでGPUオフロード
  • VS Codeは"Continue"プラグインを使う

https://continue.dev/

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

kun432kun432

llama.cpp

llama.cppをcuBLAS有効にしてビルド

$ git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
$ make LLAMA_CUBLAS=1

モデルのダウンロード

$ wget -P models https://huggingface.co/TheBloke/CodeLlama-13B-Python-GGUF/resolve/main/codellama-13b-python.Q4_K_M.gguf

llama.cppをHTTPサーバーで起動する。34Bだと-nglは最大51までオフロードできるけどOut of memoryになる時があるので、すこし下げている。

$ ./server -c 16384 --host 0.0.0.0 -t 8 --mlock -m /data/repository/models/codellama-34b-instruct.Q4_K_M.gguf -b 512 -ngl 40
(snip)
llama server listening at http://0.0.0.0:8080

{"timestamp":1693703465,"level":"INFO","function":"main","line":1600,"message":"HTTP server listening","hostname":"0.0.0.0","port":8080}

VS Code

Continueプラグインをインストールする。バージョンがv0.0.364以上であることを確認しておく。

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

インストール後に$HOME/.continue/config.pyが作成されるので、以下の内容を追記。

~/.continue/config.py
(snip)
from continuedev.src.continuedev.libs.llm.llamacpp import LlamaCpp     # 追加、ドキュメントは多分間違い

config = ContinueConfig(
(snip)
    # models部分を修正
    models=Models(
        default=LlamaCpp(
            max_context_length=16384,
            server_url="http://192.168.XXX.XXX:8080")
    ),
)

VS Codeを再起動してエラー等がなければOK。

kun432kun432

Continueプラグインの使い方

Continueプラグインでできること・できないことは以下に書いてある。

https://continue.dev/docs/how-to-use-continue

Llama.cpp(Code Llama)対応は、まだこなれてないのか、ちょいちょい変な動きをする場合があるけれども、いくつか試してみる。

1. 質問する

左のメニューからContinueを開く

質問を入力して「Continue」をクリック。

回答はストリーミングで生成される。

回答の生成が終わると内容に関するタイトルも生成される。もちろん生成されたコードをファイルにコピペできる(直接ファイルを編集もできるけどそれは後述)

続けて質問をすると、会話のコンテキストが保持されていることがわかる。(関数名だけが変更されている)。回答が英語になっているのはご愛嬌。

2. ファイル内の選択したコードについて質問する

ファイル内の文字列を選択すると、それがコンテキストになる。そしてそのコンテキストについて質問することができる。

3. ファイル内のコードを直接編集する

Continueにはいくつかのスラッシュコマンドが用意されている。ファイルを直接編集するには/editを使う。

例えば上の選択したコードを書き換えたい場合はこうする。

指示した内容にそってコードが生成され、変更前・変更後のdiff形式で表示される。

変更を反映する場合は「Accept」をクリックする。変更内容が気に入らない場合は「Reject All」で反映せず、再度質問して生成することもできる。

当然ながら0からコードを生成することもできる。

kun432kun432

ただし、/editには全般的に変な動きが見られる。たとえば、

処理が終わった後で質問内容のタイトルが生成されるのだけども、ここにプロンプトが入り込んでしまっていたり、

生成されたコードのインデントがおかしかったり、

コード以外のコメントも含まれてしまったり

Acceptで変更を反映した後もどうやら生成は継続されていて、次の質問が進まなかったり、(しばらく待つと進む)

おそらくこのあたりは、Code Llamaの生成内容が安定していないとかContinueのパースが十分でない、ということだろうと思う。多分これと同じ感じ(環境はやや異なるようだけど)。

https://github.com/continuedev/continue/issues/431

今後の改修に期待したいところ(そしてどんどん使ってバグ報告していきたいところ)

kun432kun432

所感

試すにあたりドキュメント見てもうまく行かなくてissue立てて修正してもらったりしたけども、なんとか動くようになった。まだまだ熟れていない感はある。

https://github.com/continuedev/continue/issues/445

とはいえ、

  • 大前提として llama.cpp+code llama でcopilot的なものを自前で使えるのは単純に良い。
  • 外にデータを出さなくて済むのもローカルLLMのメリット。
  • VSCode Integrationは他にも色々あるけども、いろいろ環境構築を必要とするものが多い中で、Continueはllama.cpp HTTPサーバ+VSCodeプラグインだけでいいのでかなりシンプル。

なので、今後に期待したい。

まだ軽くしかさわれてないけど、Continueそのものはそんなに悪くないと思う。OpenAIとか複数のLLMにも対応しているし、デフォルトはOpenAIのようなので、それならテストも十分されてるだろうし。とりあえず全体的に何ができるのかをもう少し追いかけてみて、llama.cppでの挙動がどこまで正しく動くのかを見極めたい。

copilotクローンとまではさすがにいかないけども、もっと熟れてくれば十分便利に使えそう。

kun432kun432

余談だけど、Continueのデフォルトの設定だとContinue側のOpen AI APIキーで利用可能なプロキシに接続して利用できるようになってるっぽい、すなわち無料。

基本的にローカルLLMを使うメリットは外にデータは出さずに済む、というところなので、自分的にはこのチョイスはないし、やるとしてもせめて自分のAPIキーをセットして使うことになると思う。

ただ、使えるモデルにgpt-4-32kとか見えてて、ちょっとグラっと来る・・・

kun432kun432

Continueの機能をもう少し把握するために、とりあえずOpenAIでやってみる。

Continueがデフォルトで提供するOpenAIプロキシはmaybe_proxy_openaiという名前になっている。

from continuedev.src.continuedev.libs.llm.maybe_proxy_openai import MaybeProxyOpenAI

(snip)

config = ContinueConfig(
    allow_anonymous_telemetry=True,
    models=Models(
        default=MaybeProxyOpenAI(api_key="", model="gpt-4"),
        medium=MaybeProxyOpenAI(api_key="", model="gpt-3.5-turbo")
    ),

ここに自分のAPIキーを設定すれば良さそうに思えるけど、なんとなくAPIキーを持ってプロキシに送られるのか?みたいな気がしてスッキリしない(軽くコード見てみたけどわからなかった)。純粋にOpenAIを使いたい場合はこうすれば良さそう。

from continuedev.src.continuedev.libs.llm.openai import OpenAI

(snip)
API_KEY = "sk-******"
config = ContinueConfig(
    allow_anonymous_telemetry=True,
    models=Models(
        default=OpenAI(api_key=API_KEY, model="gpt-4"),
        medium=OpenAI(api_key=API_KEY,  model="gpt-3.5-turbo")
    ),

AzureOpenAIの場合はこちら
https://continue.dev/docs/customization#azure-openai-service

で、このdefaultとかmediumとはなんぞや、というところは以下にある。

https://continue.dev/docs/customization#change-the-default-llm

The default and medium properties are different model roles. This allows different models to be used for different tasks. The available roles are default, small, medium, large, edit, and chat. edit is used when you use the '/edit' slash command, chat is used for all chat responses, and medium is used for summarizing. If not set, all roles will fall back to default. The values of these fields must be of the LLM class, which implements methods for retrieving and streaming completions from an LLM.

なるほど、用途(ロール)ごとにモデルを設定できるらしい。

  • default
    • デフォルト
  • small
    • 不明
  • medium
    • 要約?に使用されるモデル
  • large
    • 不明
  • edit
    • /editコマンド時に使用されるモデル
  • chat
    • Continueの画面内での質問とかのやり取りに使用されるモデル

これどうやって振り分けてるんだろう?とおもってみてみたら、各処理というかプラグインごとに設定がしてあるっぽい

https://github.com/search?q=repo%3Acontinuedev%2Fcontinue sdk.models.&type=code

で自分でカスタムなスラッシュコマンド+処理も自作するような場合はどのロールを使うかを指定すれば良い様子。

https://continue.dev/docs/customization#custom-slash-commands

smallとlargeは今のところ予備みたいなもんなのかもしれない。

kun432kun432

スラッシュコマンドはデフォルトでこういうのが用意されている。

    slash_commands=[
        SlashCommand(
            name="edit",
            description="Edit code in the current file or the highlighted code",
            step=EditHighlightedCodeStep,
        ),
        SlashCommand(
            name="config",
            description="Customize Continue - slash commands, LLMs, system message, etc.",
            step=OpenConfigStep,
        ),
        SlashCommand(
            name="comment",
            description="Write comments for the current file or highlighted code",
            step=CommentCodeStep,
        ),
        SlashCommand(
            name="feedback",
            description="Send feedback to improve Continue",
            step=FeedbackStep,
        ),
        SlashCommand(
            name="clear",
            description="Clear step history",
            step=ClearHistoryStep,
        ),
        SlashCommand(
            name="share",
            description="Download and share the session transcript",
            step=ShareSessionStep,
        )
    ],

stepで指定されているのがビルトインで用意されているpythonコードになっている。ただしここはpythonコードである必要はなくて、単にプロンプトでもいける。デフォルトで用意されているのはテストコードを書く/test

    custom_commands=[
        CustomCommand(
            name="test",
            description="Write unit tests for the higlighted code",
            prompt="Write a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.",
        )
    ],

で一つ前で書いたような、カスタムなスラッシュコマンド+自分で処理も書きたい、みたいな場合はクラスを作ってrunメソッド生やして処理を書くということの様子。

kun432kun432

チョロチョロ使ってみたけど、OpenAIだと普通に/edit動くなー。やっぱりllama.cpp向けのところがまだまだということかも。

kun432kun432

あと、気になる人はここも。

config = ContinueConfig(
    allow_anonymous_telemetry=False,
(snip)
kun432kun432

Continueにないのはコード補完かなー。/editで代替できなくはないけども、ペーンを移動しないといけない。

このスクラップは2023/09/03にクローズされました