【KARAKURI LM 10本ノック】#1 KARAKURI LM を数クリックで動かしてみよう

Yuki Yoshida
KARAKURI Techblog
Published in
16 min readJun 28, 2024

こんにちは、カラクリ R&D チームの吉田です。

LLM(大規模言語モデル)の話題が毎日のように流れてきて慌ただしいですが、皆様、お元気にお過ごしでしょうか?

弊社では KARAKURI LM という名前の LLM を開発しており、先日、その最新版をリリースしました(プレスリリース)。AWS の深層学習特化チップ Trainium を用いて、低コストで学習を実施し、国産オープンモデルとして最高性能を達成しました(2024–05–07現在)。技術的な詳細はこちらの記事に記しました。

KARAKURI LM は、ChatGPT や Claude 等とは異なり、モデルの重みが公開されている「オープンモデル」です。「オープンモデル」は、ローカル環境で動かすことができ、これには、大手 LLM ベンダーの Web API 経由で LLM を利用するのと比較して以下のようなメリットがあります:

  • セキュリティやプライバシーの向上:入力や出力にセンシティブな情報が含まれる場合、大手 LLM ベンダーの API は利用しづらい場合がありますが、ローカル LLM であれば、それらを気にする必要がありません。
  • 無料:LLM の利用による課金が全く発生しません。費用を気にせず、好きなタイミングで好きな回数だけ利用できます。
  • 無制限に使える:サービス終了となるリスクがありません。OpenAI がいくら儲けていても、突然 API の提供を終了する可能性はゼロではありません。ローカル LLM では、そのようなリスクを回避できます。

ここまで読んで「ちょっとローカル LM に興味が出てきた」「KARAKURI LM を一度触ってみたい」と思っていただけた方がいれば幸いです。しかし同時に「でも、ローカルで LLM を動かすのって難しそう」と感じていらっしゃる方も多いかもしれません。

今回の記事は、そのような方々のために執筆しております。この記事に従って進めていただければ、わずか数クリックで KARAKURI LM を無料で動かす体験ができます。ぜひこの機会に、KARAKURI LM の魅力を体感してみてください!

ハンズオン

こちらの Google Colab ノートブック(無料版で OK です)で進めます。以下の記事中にコードが何箇所かありますが、上記の Colab ノートブックに同様の内容が書かれているため、書き写す必要はありません。こちらの記事を読み進めつつ、Colab ノートブックのセルを順にクリック(実行)していただければスムーズに進められるかと思います。

  • Google Colab とは?
    Google Colab は、ブラウザから直接アクセスできる無料のクラウドベースの Jupyter ノートブック環境です。Python を使用したコードの作成、実行、共有を容易に行え、強力な計算リソース(GPU や TPU)も提供されています。データ分析や機械学習の分野で広く利用されています。
    一般的に、LLM を満足に動かすには、CPU だけだと厳しいです。GPU・TPU・その他の専用チップの選択肢がありますが、いずれも購入には数万円〜数百万円かかります。また、購入ではなくAWS や GCP 等で GPU マシン等を借りることもできますが、これも同様に課金が発生します。
    一方 Google Colab は、時間制限はあるものの、誰でも無料で GPU マシンを動かすことができます!
  • スマホの方は、Colab ノートブックを開くのは難しいので、本記事を先にお読みになり、ノートブックは後で PC 環境からお試しいただくのがお勧めです。

まずは、Colab ノートブックを開いてみましょう。Colab ノートブックが初めての方は、基本的な操作方法をノートブック冒頭にまとめてありますので、ご参照いただければ幸いです。

KARAKURI LM に限らず、ローカル LM での推論を行うには、以下の手順を踏む必要があります。

  1. モデルをダウンロードする
  2. モデルを読み込んで動かすためのソフトウェアをインストールする
  3. ソフトウェアを起動してモデルを読み込み、推論させる

以下、それぞれの手順を説明していきます。

モデルをダウンロードする

今回は、弊社の KARAKURI LM の最新版である 8x7B モデルを動かします。ただし、利用可能なメモリ量の関係で「オリジナルのモデル」ではなく「2ビット量子化モデル」を動かします。

  • 量子化とは?
    量子化とは、深層学習モデルのサイズを削減するための手法の一つで、モデルの重みを低い精度で表現することで、モデルのサイズを削減します。これにより、メモリ使用量やロード時間を削減できます。
    今回利用する弊社モデルの量子化版は、@mmnga さんが製作・公開してくださったものとなります。
  • 「2ビット」の量子化とは?
    「2ビット」の量子化とは、それぞれの重みの値を2ビットの精度で表現することを指します。オリジナルのモデルでは、それぞれの重みの値は16ビットの精度で表現されていますが、これを2ビットに変換することで、メモリ使用量がおよそ8分の1に削減できます。
    量子化によってモデルの精度は低下してしまいますが、メモリ使用量が同水準の非量子化モデルと比較すると精度が良いと言われています (REF)。

モデルは、Colab 上で以下のコマンドを実行するとダウンロードできます(ノートブック内の、下記コマンドの書かれたセルの左端をクリックしてください)。いま筆者が試したところ、6分程度かかりました。

%cd /content
!wget https://huggingface.co/mmnga/karakuri-lm-8x7b-chat-v0.1-gguf/resolve/main/karakuri-lm-8x7b-chat-v0.1-Q2_K.gguf
  • 注意:モデルのダウンロードは、Google Colab が動いているリモートマシンへのダウンロードであり、手元の PC へのダウンロードではありません。そのため、手元の PC の空き容量や通信量を気にする必要はなく、また手元の通信環境の良し悪しもダウンロード時間には影響しません。

モデルを読み込んで動かすためのソフトウェアをインストールする

選択肢がいくつかありますが、今回は、よく使われている llama.cpp を使用します。Colab 上では、以下のコマンドでインストールできます。いま筆者が試したところ、12分程度かかりました。

%cd /content
!git clone https://github.com/ggerganov/llama.cpp
%cd llama.cpp
!git checkout 43b35e38
!mkdir build
%cd build
!cmake .. -DLLAMA_CUBLAS=ON
!cmake --build . --config Release

ソフトウェアを起動してモデルを読み込み、推論させる

例えば、KARAKURI LM に「ログインの方法を教えてください」と聞いてみましょう。Colab 上で以下のコマンドを実行すると、聞くことができます(コマンドが長いですが、右の方にスクロールすると「ログインの方法を教えてください」という文字列を確認できます)。いま筆者が試したところ、4分程度かかりました。

%cd /content/llama.cpp
!./build/bin/llama-cli -m ../karakuri-lm-8x7b-chat-v0.1-Q2_K.gguf --temp 0 -p "<s>[INST] <<SYS>>\nあなたは優秀なAIアシスタントです。\n<</SYS>>\n\nログインの方法を教えてください [ATTR] helpfulness: 4 correctness: 4 coherence: 4 complexity: 4 verbosity: 4 quality: 4 toxicity: 0 humor: 0 creativity: 0 [/ATTR] [/INST]" -ngl 28 -b 1
  • -ngl 28 は「モデルの全層のうち何層分を GPU にロードするか」を指定するオプションです(この場合、全33層のうち28層を GPU メモリに、残り5層は CPU メモリにロードします)。
  • Google Colab の仕様上、確保される GPU メモリのサイズが状況によって変わります。今試すと 15GB が確保されており(画面右上のグラフをクリックすると右側に「リソース」タブが開き、その中の「GPU RAM」の「0.0 / 15.0 GB」等の記載を見れば確保されているサイズがわかります)、-ngl 28 の設定でぎりぎりロードできました。もし cudaMalloc failed: out of memoryunable to load model のようなエラーが表示された場合は、 -ngl 28 の値を小さくして(例えば -ngl 20-ngl 16のように変更して)実行してみてください。数値を小さくするほど、ロードに成功する可能性は高くなりますが、推論に要する時間は長くなります。

しばらくモデルのロードに関するログが表示され、その後、モデルによる推論のログが1トークンずつ表示されます(最初は入力内容がそのまま表示されますが、それに引き続いてモデルの推論結果が表示されます)。推論結果は、例えば以下のようになります。

ログインするには、

1. 画面上部の「ログイン」リンクをクリックするか、[https://ja.wikipedia.org/wiki/Wikipedia:ログイン](https://ja.wikipedia.org/wiki/Wikipedia:ログイン) にアクセスします。
2. ログインするアカウントの種類を選択します。
3. ユーザー名またはメールアドレスを入力します。
4. パスワードを入力します。
5. 「このコンピュータを記憶する」にチェックを入れ、「ログイン」をクリックします。

これでログインが完了します。 [end of text]

最後に、モデルの推論に要した時間などの統計情報が、例えば以下のように表示されます。

llama_print_timings:        load time =  105055.63 ms
llama_print_timings: sample time = 9.52 ms / 217 runs ( 0.04 ms per token, 22798.91 tokens per second)
llama_print_timings: prompt eval time = 11378.43 ms / 20 tokens ( 568.92 ms per token, 1.76 tokens per second)
llama_print_timings: eval time = 45018.69 ms / 216 runs ( 208.42 ms per token, 4.80 tokens per second)
llama_print_timings: total time = 56481.61 ms / 236 tokens

上記の「ログインの方法を教えてください」の部分を、お好きな文言に差し替えてぜひ実行してみてください。

サーバーを立ち上げる

llama.cpp には、サーバープログラムも付属しています。以下コマンドで立ち上げられます。(※前節で -ngl 28の設定を小さく変更しないとエラーになった場合は、以下コマンド中の同様の記述箇所も同様に変更して実行してください。)

!nohup ./build/bin/llama-server --port 8077 -m ../karakuri-lm-8x7b-chat-v0.1-Q2_K.gguf -ngl 28 &

サーバー起動時に、モデルが読み込まれます。これには数分かかりますが、それ以降はモデルはロードされっぱなしとなるため、ここに推論リクエストを送ることで、毎回ロード時間を何分も待つことなく返答を得ることができます。

サーバーを起動してから2, 3分ほど経過したら、サーバーがモデルを読み込み終えて待機状態となっているかを確認しましょう。以下のコマンドで、サーバープログラムから出力されたログの直近数行を確認できます。

!tail nohup.out

もし

INFO [                    init] initializing slots | tid="134692479152128" timestamp=1718592059 n_slots=1
INFO [ init] new slot | tid="134692479152128" timestamp=1718592059 id_slot=0 n_ctx_slot=32768
INFO [ main] model loaded | tid="134692479152128" timestamp=1718592059
INFO [ main] chat template | tid="134692479152128" timestamp=1718592059 chat_example="[INST] <<SYS>>\nYou are a helpful assistant\n<</SYS>>\n\nHello [/INST]Hi there</s>[INST] How are you? [/INST]" built_in=true
INFO [ main] HTTP server listening | tid="134692479152128" timestamp=1718592059 n_threads_http="3" port="8077" hostname="127.0.0.1"
INFO [ update_slots] all slots are idle | tid="134692479152128" timestamp=1718592059

のような行が表示されていれば、モデルの読み込みが完了しています(まだの場合は、もう少し待ちましょう)。モデルの読み込みが完了したら、以下のコマンドで推論リクエストを送ってみましょう。

!curl --request POST \
--url http://localhost:8077/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "<s>[INST] <<SYS>>\nあなたは優秀なAIアシスタントです。\n<</SYS>>\n\n「送ってくれてありがとう」という文章を敬語に直してください。 [ATTR] helpfulness: 4 correctness: 4 coherence: 4 complexity: 4 verbosity: 4 quality: 4 toxicity: 0 humor: 0 creativity: 0 [/ATTR] [/INST]","n_predict": 128}'

以下のような返答が、数十秒程度で返ってきます。

{"content":"送っていただき、 誠にありがとうございます。","id_slot":0,"stop":true,"model":"../karakuri-lm-8x7b-chat-v0.1-Q2_K.gguf","tokens_predicted":27,"tokens_evaluated":36, ...}

補足:OpenAI 互換サーバー

サーバーを立てることで、毎回ロードをしなくても推論してくれるようになりました。

このサーバープログラムのもう一つの良いところは、「OpenAI API を利用した既存のシステム」への繋ぎ込みが容易となることです。

例えば、以下のコードは OpenAI API を利用している最も単純なコードです。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは猫です。"},
{"role": "user", "content": "鳴いてみて!"},
]
)

print(response)

これの client = OpenAI()の行を以下のように書き換えるだけで、繋ぎ換えが完了します。

client = OpenAI(base_url="http://localhost:8077/v1", api_key="dummy")

※ ただし、上記の Python コードでは、厳密には KARAKURI LM 特有の「SteerLM 属性パラメータ指定」がうまく行われていません(単に属性パラメータの指定ができないだけでなく、プロンプトフォーマット自体が誤っていることによる推論精度の低下が起こり得ます)。この問題に対応する方法は、次回以降の記事で触れたいと思います。

LLMを動かす環境の選択肢

さて、ここまで KARAKURI LM を Colab ノートブックで動かす方法を解説しましたが、LLM をローカルで動かす方法は、Colab ノートブック以外にもあります。現在の主な選択肢を以下に列挙します:

  1. Apple Silicon 入りの MacBook / Mac Studio
    MacBook はラップトップで、Mac Studio はデスクトップです。いずれも、Apple Silicon 入りのマシン(名前に M1, M2, M3 等がついているものです)は Unified Memory Architecture (UMA) を採用しており、CPUとGPUのメモリが共通化されています。
    価格は数十万円〜100万円程度です。
    メモリ32GBのマシンでも、7Bモデルや13Bモデルの量子化版であれば動かせます。メモリ128GBのマシンであれば、70Bの8ビット量子化モデルや104Bの4ビット量子化モデルが動かせます。
  2. GPUマシン(手元・オンプレ)
    価格は揃えるGPUのメモリ量や枚数に依存して数十万円〜数千万円と幅広いです。
  3. GPUマシン(クラウド)
    この選択肢は「ローカルLM」のメリットの 1 つであるセキュリティー・プライバシー面には懸念が残ります(Colab も同様です)。しかし、初期投資ゼロ・利用料に応じた課金なので、手軽に始められますし、また Colab のような利用制限もありません。

なお「特定のモデルを満足に動かすためにはどの程度のメモリサイズが必要になるか」は、またの機会に詳しく解説したいと思います。

おわりに

今後も、KARAKURI LM を多くの皆様に活用していただくために、KARAKURI LM 10本ノックと称して様々な情報を共有してまいります。

最後に、皆様にお願いがあります。執筆の励みになりますので、Clap(拍手アイコン)のタップをお願いします!

--

--