りんな(rinna/GPT2)の愛読書は"夏目漱石"

日本語で事前学習したrinna/japanese-gpt-1bRust言語で使ってみた。
この日本語GPTは、一般的な日本語テキストの特徴を持つ高度な日本語文章を自動生成できるということです。
更にこの日本語GPTを青空文庫の夏目漱石作品集でファインチューニングしてみた。
さて、これで漱石の文体に特化した、漱石フレーバーな文章を自動作成できるでしょうか。
また、RustとPythonで実行した場合の速度比較もやってみます。
Rustのようなコンパイラ言語は高速なので、Pythonのようなインタープリタ言語と比較してエネルギー効率が高いという意見もある
C/C++での大規模開発を経験した人は、悪夢のようなメモリー関連のトラブルを味わったことがあるかもしれない。
Rustは実用的な言語なので、試してみるには十分価値があると思う。

 RustでTransformer GPTモデルを扱うにはpytorch_model.binではなくRust用に変換したrust_model.otを使う。
最近のEleutherAI/gpt-neoにはrust_model.otも同梱されているので、段々、一般的になってきたのかなと思っている。

rinna/GPT2はイエローバック社のgpt-neo-japanese-1.3Bとは違って字句解析にT5Tokenizerを使う。
このことを考慮してrustでコードを書くと以下のような感じになる。

let  gpt2_model = GPT2Generator::new(generate_config)?;
let tokenizer = T5Tokenizer::from_file(
        vocab_resource.get_local_path().unwrap().to_str().unwrap(),
        true,
  )?;
let input_text = "夏目漱石は、";
let encoded_input =
        tokenizer.encode(input_text, None, 512, &TruncationStrategy::DoNotTruncate, 0);
let input_tensor =
       Tensor::of_slice(encoded_input.token_ids.as_slice()).to_device(Device::cuda_if_available()).unsqueeze(0);
let model_output = gpt2_model.generate_from_ids_and_past(input_tensor, None, None); 
let output = tokenizer.decode(model_output[0].indices.as_slice(), true, true);

実際にrinna/GPT2をrustで実行してみる。
導入フレーズは"夏目漱石は、"にしてみた。
GPUを使用すると5GBを超えるGPTモデルのロード時間を含めて約15秒でそこそこの文章を生成する。
次に今回の本題として、このGPT2を夏目漱石作品集を使ってファインチューニングしてみた。
finetuningのやり方はこのサイトを参考にした。
漱石文学でfinetuneするとこういう感じになる。
導入フレーズを入力してください。
夏目漱石は、
 夏目漱石は、明治時代を代表する文豪です。夏目漱石の代表作は「吾輩は猫である」や「坊っちゃん」、「草枕」「三四郎」、それに「虞美人草(ぐびじんそう)」などたくさんあります。
処理時間(ms):1733
自動文章生成にかかる時間は数秒。
うまくファインチューニングすると、実用的な文章を生成する。
Rust言語を使うと、コンパイルされた高速なバイナリコードが得られるので、ソースコードなしでバイナリー配布ができる。
FAQやAIによる自動応答などの実用的なシステムが構築できるだろう。
 
文章生成パラメータを調整すると以下のような文章が出てくる。
人によって感じ方は違うと思うが、なんとなく漱石ポイ文章になるのが面白い。
女子高生にも漱石文学は人気があるのかな。
 

コメント powered by CComment