はじめに
Rubyでなにか大規模言語モデル (Large Language Models, LLMs) に関することをやってみようと思って、SentencePieceのbinding gemがないことに気づいて作った。
SentencePieceはニューラルネットワークな言語処理向けに作られたTokenizer/Detokenizerで、文が与えられると単語に分割してIDを割り当てる。逆にIDのリストから文を再構成することができる。この逆変換が可能なことでEnd to Endの...あとは作者のKudo TakuさんのQiita記事に。
インストール
sentencepiece.rbは、SentencePiece自体を同梱していないので、各パッケージマネージャーでこれをインストールする。Ubuntuであればaptで、macOSであればhomebrewでインストールできる。
$ sudo apt-get install sentencepiece libsentencepiece-dev
$ 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があるので、なんとかならないかな〜引き続きやっていきですね(雑)