はじめに
llama.cppはMetaの大規模言語モデル (Large Language Models, LLMs) であるLLaMAを、量子化することでCPU上で動作させるものである。C/C++で実装されているので、Ruby bindingsを作って、Rubyから呼び出せるようにした。
使い方
インストールは通常の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度の更新とかで。