コドモン Product Team Blog

株式会社コドモンの開発チームで運営しているブログです。エンジニアやPdMメンバーが、プロダクトや技術やチームについて発信します!

M2 MacBook AirにローカルLLMを入れてみた

こちらは「コドモンAdvent Calendar 2023」の12日目の記事です。

qiita.com

こんにちは!プロダクト開発部の成本です。 昨今AI技術が急速に浸透しており、弊社でも今年Github Copilotが導入されました。書いている途中のコードが自動補完されたり、質問に対して的確な答えを提示してくれる優れものです。これだけでも普段の開発効率が劇的に向上しましたが、SNSでは「AIの発展でエンジニアの働き方が今後も大きく変わり続ける」との声が絶え間なく届いてきます。そこで今回は重めの腰をあげてLLMが開発プロセスをどのように変えていくのか、私物のMacBook Airを使って検証してみました。

この記事は何か

M2 MacBook Airのローカル環境にLLMを立てたという「やってみた」系の記事です。その際の手順と感想、今後この仕組みを使ってやってみたいことについて記述していきます。

LLMとは何か・今回選んだLLMについて

LLMとはLarge Language Modelsの略であり、自然言語処理に使うことができるデータです。 用途に応じて幅広い種類のLLMが存在し、代表的なものでは以下が挙げられます:

  • GPT3.5
  • GPT4
  • Bert
  • Llama2

今回は一定規模以下の開発には無料で商用利用もできるMetaのCode Llamaを使いました。

ローカルで動かすまでの手順

pythonの仮想環境の構築

python3 -m venv {環境名}
source venv/bin/activate
pip install --pre torch torchvision --extra-index-url \ https://download.pytorch.org/whl/nightly/cpu

llama.cppの取得

llama.cppとはモデルに量子化という精度を下げて処理速度を高速化する仕組みを用いて、MacBookのような高性能なGPUを積んでいないマシンでもLlamaを動かせるようにしてくれるすごいツールです。以下の公式ページを参考にローカルにクローンしました。 github.com

モデルの取得

肝心のモデルはMetaの公式Githubから取得できます。

github.com

READMEに記載のDownloadからMetaのウェブサイトにアクセスし認証コードを発行します。 リポジトリをローカルにクローンし、bash download.shを実行して欲しいモデルを選択します。 今回は「codellama-7b-instruct」を選択しました。「7B」はパラメータ数が70億個(7 Billion)あることを示しており、これより上の「13B 」や「34B」を使用すれば精度は上がりますが当然ながら動作は重くなります。

取得したモデルは./codellama/CodeLlama-7b-Instructに格納されます。

量子化

上述した量子化の出番です。 まず./codellama/CodeLlama-7b-Instruct/をディレクトリごと./llama.cpp/配下に移動します。 そして下記コマンドで軽量化したモデルを作成します。

./quantize ./models/CodeLlama-7b-Instruct/ggml-model-f16.gguf ./models/CodeLlama-7b-Instruct/ggml-model-q4_0.gguf 2

llama.cppをサーバーモードで起動する

これだけでもTerminalからllama.cppを利用できますが、今回の目標は「開発プロセスの変化」を目にすることです。 そのためVSCodeから対話形式でllama.cppを使える様に設定を施していきます。 まず、llama.cppをサーバーモードで起動します。

./server -m models/CodeLlama-7b-Instruct/ggml-model-q4_0.gguf -c 2048

Continueプラグインを取得し設定する

VScodeでプラグインを取得します。

marketplace.visualstudio.com

~/.continue/config.pyという設定ファイルが作成されるので、冒頭の記述を以下のように変更します。

config = ContinueConfig(
    allow_anonymous_telemetry=True,
    models=Models(
        default=LlamaCpp(
            max_context_length=16384,
            server_url="http://127.0.0.1:8080"),
    ),

Prompt Templateを使い指示を出す

これでVSCodeからCode Llamaに質問をするための準備が整いました。普通に文字列をタイプできますが、プロンプトテンプレート(質問文のテンプレート構文)を使うことで回答の精度を上げられるのがCodeLlama instructの特徴です。下記構文に質問を入れて利用しました。

<s>[INST]{文章}[/INST]

入れてみての感想

驚愕です。よくあるCRUD処理であればほとんど手を動かさずにAPIが作れます。プロンプトでモデルを定義した上でクリーンアーキテクチャの各レイヤーのインターフェースを作成してもらうことができ、またその実装を任せることもできます。 他にも驚いたのはコーディング以外の質問も幅広く答えてくれる点です。例えば自分のサービスでユーザーに提供したい価値を3つほど伝えると、具体的なプロダクトのアイディアを10個ほど瞬時に提案してくれます。 この10個の中から実際に形にしたいものがあったので、今後はこのCode Llamaを使いながら一つプロダクトを作ってみようと思います。

結論

冒頭で提示した「LLMが開発プロセスをどのように変えていくのか」というテーマについての結論です。 LLMは設計やコーディングなど、アイディアを形にする上で必要になる複雑な手段を簡略化し手助けしてくれる強力なツールでした。 また目的の解像度を上げる手助けもしてくれたため、自分がより「やりたいこと」に注目する時間を増やしてくれました。今後の動向にも注意していきたいです。