洋食の日記

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

SentencePieceのRuby bindingsを作った

はじめに

Rubyでなにか大規模言語モデル (Large Language Models, LLMs) に関することをやってみようと思って、SentencePieceのbinding gemがないことに気づいて作った。

github.com

SentencePieceはニューラルネットワークな言語処理向けに作られたTokenizer/Detokenizerで、文が与えられると単語に分割してIDを割り当てる。逆にIDのリストから文を再構成することができる。この逆変換が可能なことでEnd to Endの...あとは作者のKudo TakuさんのQiita記事に。

qiita.com

インストール

sentencepiece.rbは、SentencePiece自体を同梱していないので、各パッケージマネージャーでこれをインストールする。Ubuntuであればaptで、macOSであればhomebrewでインストールできる。

Ubuntu:

$ sudo apt-get install sentencepiece libsentencepiece-dev

macOS:

$ brew install sentencepiece

その上でsentencepice.rbをインストールする。

$ gem install sentencepiece

M1/M2のmacOSであれば、SentencePieceが/opt/homebrew以下にインストールされるので、これをopt-dirとして指定する必要がある。

$ gem install sentencepiece -- --with-opt-dir=/opt/homebrew

使い方

適当なテキストファイル (ここではcorpus.txt) を用意してこれを学習する。

require 'sentencepiece'

SentencePiece::SentencePieceTrainer.train(
  '--input=corpus.txt --model_prefix=sample_model --vocab_size=1000'
)

上記の例では、sample_model.modelというファイルが作られるので、これを読み込んで、encodeしたりdecodeしたりする。

require 'sentencepiece'

sp = SentencePiece::SentencePieceProcessor.new(model_file: 'sample_model.model')

sp.encode('Hello world!')
# => [151, 88, 21, 887, 147]
# ※このIDのリストはモデル次第で変わる

sp.decode([151, 88, 21, 887, 147])
# => "Hello world!"

実際は、配られているモデルにxxx.modelとか訓練済みのSentencePieceがあったりして、これを読み込み、自身で訓練することはあまり無いように思う。

おわりに

SentencePieceだけでLLMsが作れるわけではないが、PyTorchのRuby bindingであるtorch.rbがあるので、なんとかならないかな〜引き続きやっていきですね(雑)