洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

llama.cppのRuby bindingsを作った

はじめに

llama.cppはMetaの大規模言語モデル (Large Language Models, LLMs) であるLLaMAを、量子化することでCPU上で動作させるものである。C/C++で実装されているので、Ruby bindingsを作って、Rubyから呼び出せるようにした。

github.com

使い方

インストールは通常のnative extensionsなgemと同様である。

$ gem install llama_cpp

モデルを用意して量子化する必要があるが、llama.cppをcloneしてきて、Usageの通りにすればできる。

GitHub - ggerganov/llama.cpp: Port of Facebook's LLaMA model in C/C++

あとは、普通にrequireすれば使える。

require 'llama_cpp'

# パラメータを用意して、
params = LLaMACpp::ContextParams.new

# モデルを読み込む。
context = LLaMACpp::Context.new(model_path: '/path/to/ggml-model-q4_0.bin', params: params)

# ...

あとはllama.cppにある関数は実装しているので、よしなにだが、わりとllama.cpp自体に詳しくないと難しい。 そこで、文字列を渡すと、その続きを生成する関数を用意した。

puts context.generate(context, 'Please tell me the largest city in Japan.')

# なにかしら文字列が返る

おわりに

llama.cppは、現在はLLaMAだけでなく、AlpacaやGPT4Allなどのモデルにも対応している。LLMsをCPU上で動作させる標準的なライブラリになりそうで、Ruby bindingsを用意しておくのは意味があると考えた。が、開発というかリリースが速くて、大変だ。これも作っている間に、30Bモデルを6GBのメモリで動作させる改善が入り、その新しいモデルが読み込めないbindingsになってしまった。ひとまず、できている状態で0.0.1をリリースして、新しいモデルが読み込めるようにして、0.0.2をリリースした。これからも「できるだけ」ついていこうと思う。2週に1度の更新とかで。