1月末にSakana.AIがTinySwallow-1.5Bという小規模日本語言語モデルを発表しました。ちょうど山梨県は甲府の企業で生成AI研修をやっている最中のことで、受講者の皆さんがワークをやっている間にWebブラウザ上で動作するチャットアプリをちょっと手元で試して、ご紹介したということがありました。
それまでGPT-4oとかをご紹介していたので、生成される内容自体は大したことないというか、ハルシネーションが盛大に含まれる様子はちょっと失笑といった感じだったのですが、それがクラウドで動作しているわけではなく、ブラウザ上だけでが動いているのだと説明したときに、驚きに変わったことを覚えています。
何より自分自身が感動していたのです。それまで、Let’s noteに外付けGPU Box(GeForce RTX3070)をつないで、LM Studioで言語生成して、あまりの生成速度の遅さに辟易した経験があるのです。それが、CPUだけで(しかもブラウザ上で)現実的といえる速度で日本語が生成されている。
小規模言語モデルゆえに知識が少ないから、ハルシネーションは起きるのですが、日本語としては破綻していない。ということは、RAGで知識を入れつつ回答を生成させれば、充分に使えるのではないか。これが衝撃だったのです。
TinySwallow-1.5Bをローカルで動かしたい
というわけで、この記事の本題なのですが、ローカルで動かしたいのです。いくつかの方法を試してみました。
環境構築
Python 3.11は動作しているものとして、仮想環境を作成し、CPUだけの環境で動作させるための環境構築を行います。
まず、PyTorchのCPU版をインストールします。
さらに、Transformersを導入します。
HuggingFaceからモデルをダウンロードして生成する
まず、試してみたのがこんなコードです。きちんと動作します。
最初はHuggigFaceからモデルをダウンロードするので時間がかかりますが、ダウンロードしたモデルはキャッシュするようにしているので、2回目以降はそれほど遅くありません。
26秒ほどかかって、このような文章が生成されました。急にSEOやアフィリエイトの話が始まりました。微妙・・・。
Instructモデルを使う
このような言語生成で使用するには、Instructモデルの方が良いので、それもやってみます。質問文はuserロールのメッセージとしてセットします。
生成には1分54秒もかかってしまいましたが、文章としてはなかなかです。ただ、ハルシネーションはあり、橋本花火大会とか大門通商店街など、謎なキーワードが登場しています。ここはRAGでどうにかしてやりたいところです。
llama.cppを使ってみる
生成精度はひとまず良いとして、生成時間をもっと短縮したいところです。TinySwallow-1.5BではGGUFバージョンも提供されています。GGUFは量子化に対応した軽量化と高速化を目的に最適化されたモデルフォーマットであり、llama.cppやggmlベースのエンジンで使用することができます。
llama-cpp-pythonの導入
llama.cppはその名のとおりC++で実装されていますが、そのPythonバインディングが提供されており、pipで導入できるパッケージもあるので、それで導入します。
GGUFファイルのダウンロード
こちらのサイトからGGUFファイルをダウンロードできます。
Q8とQ5の2つのバージョンが提供されています。Q8の方がより正確ですがやや遅く、Q5はQ8より精度が落ちますがより速く動作します。
今回は、tinyswallow-1.5b-instruct-q5_k_m.gguf
をダウンロードしました。1.1GBほどあります。
llama-cpp-pythonで言語生成
このようなプログラムで言語生成できます。
100文字以内という指示をしているため10秒程度で、このような文章が生成されました。佐賀県とは隣接していません・・・。
langchainで使ってみる
llama-cpp-pythonで動けば、langchainでも使用できます。
langchainで動くとなれば、テンプレートも使用できますし、RAGでもAIエージェントでもチャットでも使えるので、これが一番実用的ですね。。
46秒ほどで、このようなAIMessageのレスポンスが返ってきました。ちょっと遅いかなぁ。
ということで、これでもCPUだけでここまで動くというのは立派です。今後、活用方法を探っていきたいと思っています。