rinna株式会社さんが日本語版GPT-2をオープンソースで公開されています。
早速使ってみます。
学習済みモデルを使って文章生成してみましょう。
環境は、スッピンのJetson Nano + コンテナ です。
Jetpack は4.5 (L4T R32.5.0) を使って初期設定しておきます。
ドッカーイメージはnvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.7-py3 です。
Pytorch(1.7.0)、 torchvision(0.8.0)、 torchaudio (0.7.0)が実装されています。
まずは、イメージをダウンロード
1 |
sudo docker pull nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.7-py3 |
作業用ディレクトリ作成
1 |
mkdir /home/jetson/work-gpt2 |
SWAPは6GBくらい取っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
sudo swapoff -a sudo fallocate -l 6G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile free -h //恒久化 sudo cp -p /etc/fstab{,.bak} echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab /swapfile none swap sw 0 0 |
my_gpt2 という名前でコンテナ作成
sudo docker create -it --name my_gpt2 --gpus all --network host -v /home/jetson/work-gpt2:/work nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.7-py3
コンテナ起動
1 |
sudo docker start -i my_gpt2 |
アップデート&アップグレードしてライブラリやパッケージをインストール
1 2 3 4 5 6 |
apt update apt upgrade -y apt install python-pip python3-pip -y python3 -m pip install --upgrade pip apt install nano |
GPT-2用にライブラリをインストール
1 2 |
pip3 install transformers==4.5.0 pip3 install sentencepiece==0.1.95 |
注:transformersのインストールでエラーが発生した場合、ここを参照してみてください。
日本語を使うのでコンテナを日本語化しておきます。
1 2 3 4 |
apt install language-pack-ja-base language-pack-ja locale-gen ja_JP.UTF-8 //永続化 echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc |
コンテナを終了
Ctrl + D
コンテナを再起動
1 |
sudo docker start -i my_gpt2 |
作業フォルダへ移動
1 |
cd /work |
Pythonファイルを作成
学習済みモデルとしてjapanese-gpt2-mediumを使います。
以下のコードは初回実行時はいくつかファイルダウンロードが実行されるので少々時間を要します。
【gen_gpt2.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import sys from transformers import T5Tokenizer, AutoModelForCausalLM args = sys.argv prompt = args[1] model_name = 'rinna/japanese-gpt2-medium' print("preparing tokenizer...") tokenizer = T5Tokenizer.from_pretrained(model_name) print("preparing model...") model = AutoModelForCausalLM.from_pretrained(model_name) prompt_text = prompt input_ids = tokenizer.encode( prompt_text, add_special_tokens = True, return_tensors = "pt" ) input_ids output_sequences = model.generate( input_ids = input_ids, max_length = 100 + len(prompt_text), temperature = 1.0, top_k = 0, top_p = 0.9, repetition_penalty = 1.0, do_sample = True, num_return_sequences = 3, ) output_sequences print("generating responces...") for index, generated_responce in enumerate(output_sequences): generated_responce = generated_responce.tolist() text = tokenizer.decode(generated_responce, clean_up_tokenization_spaces=True) responce = prompt_text + text[len(tokenizer.decode(input_ids[0], clean_up_tokenization_spaces=True)) :] + "\n"*2 print(str(index+1) + ".\n" + responce) fp = open("result.txt","a") fp.write(responce) fp.close() |
以下は例です。”吾輩は”というprompt/prefixに続く文章を予測して生成させてみます。
1 |
python3 gen_gpt2.py "吾輩は" |
num_return_sequences に3を設定しているので、生成される文は3種類です。
top_kは40がいいらしいですが、0でやってみます。
生成文のtokenの数はmax_length で設定します。
このような設定で、Nanoの場合は生成に8分くらいかかります(tokenizer とmodel の準備に5分、文書生成に3分くらい)。
result.txt に、以下のような文章が生成されました(結果は毎回異なりますが、今回はなにやらシュールです^^)。
1.
吾輩は 二十世紀のはじまりを 彷徨っている われらなのだな・・・ この歌が歌われている頃の 僕は 小学1年生で 鹿児島にある 小学校に入学していたはずだ。 その10年後に 祖母が亡くなられた。 祖母は 当時は不穏なムードで 何が起こるかわからない、五感をフルに使って命の危険を感じる生活を強いられたそうだ。 天気予報士の 唯我独尊の癖に 非常事態の場合には
2.
吾輩は どちらでもない どちらでもない という言葉は使ったことがありません。 20年経ったら振り返らずにしまっておこうと思っているんですが・・・ ( 2ちゃんは想像するだけで大変なことになると本で読んでました。 ああいうのを見かけたときに思わず悲鳴をあげてしまうような人たちで 機会があれば是非お聞きしたいのですが、ハセツネの歴代の入賞者一覧は 開会式は13時30分に始まると聞いていま
3.
吾輩は 桃色小僧 殺気の歌(アングリング トラックス)は、1978年6月21日に発売された18禁ラノベ。「うしおととら」を原作とした一連の群像劇となる。アニメ化、一部実写化、舞台化など幅広いメディアミックス展開がされている。 内容についてはネット上でも特に批判的な意見もなく、もう発表されている通り完璧な完成形となっている。 評価に関しては前述した通りだが、その物足りない文章量の多さも強烈だ。文章
Appendix
gen_gpt2.pyはJupyter Notebookを使ったほうが時間の節約になります。
使用したイメージにはNotebookは実装されていないのでインストールしてやります。
1 |
pip3 install jupyterlab |
マウントしておいたworkフォルダーへ移動して、Jupyter Notebook を起動
1 2 |
cd /work jupyter notebook --ip=0.0.0.0 --allow-root |
token付きでURLが表示されますので、コピーして外部ブラウザーからNotebookを開きます。
output_sequencesの前と後でセルを分割して実行。
後のセルの先頭で以下を記述しておきます。
prompt_text = “XXXXX”
Appendix1
GPT-2 でIF文(仮定)でPromptを書いてみた場合です。
GPT-3を使って詩(エクフラシス)を生成し、様々なアーティストとコラボするプロジェクト(Aikphrasis Project)がHolly Grimm さんのサイトで紹介されています。
例えば…..
GPT-3 が生成したエクフラシスとコラボしてCarol Rose Brown さんが描かれたものです。
エクフラシス
1 2 3 4 5 6 7 8 9 10 11 12 13 |
A vast space is growing; here amongst the mesas the light is going out. A figure, colourless, amongst grey rocks and dark trees, can only be seen in parts as though the edges are still forming. Moving on, there is something approaching, a dark simulacrum, life and colour feeding, spilling, across the piles of sticks. The trail of the belly is lighter, but there is no head, no face or mouth, just the moving, the probing of the other. All light has been consumed. A bright, mineral, sulphur glow is coming from the tips of the sticks. The space is locking. Everything is dying into these anonymous forms. |
13″x20″
HollyさんとAI Curator(GPT-3)が対話している部分も興味深いです。
この先には人間(Human Being)+ GPT-3 + GAN で描かれたものも出てきそうな…..。
参考までに、StyleGAN 、Image GPT、DALL-E、CLIP
毛色は違いますが…magenta、AI Portraits Ars について
Next
GPT-3 を使ったPrompt Programming
GPT-3のAPIを使う場合は申請が必要です、どういうふうに使うか考えておきましょう。
Appendix
GPTー>Generative Pretrained Transformer
言語を抑制したトランスフォーマーは、非言語的なタスクにも役立つ!
Appendix 2
古いJetpackを使う場合の注意点
NVIDIAのArchiveページにある古いバージョンのJetpack(4.5.1 や 4.4.1)を使う場合、最近になって気になる症状が出るようになりました。
sudo apt upgrade や sudo apt install xxx を実行すると最後に以下のようなメッセージが表示されます。
1 2 3 |
処理中にエラーが発生しました: nvidia-l4t-bootloader E: Sub-process /usr/bin/dpkg returned an error code (1) |
NIVIDIAのフォーラムなどではだいぶ前から話題になっていたもののようです。
で、nvidia-l4t-bootloaderなるものは、どいうやらカーネルイメージに関係したものらしいという以外、管理人には不明です。
エラーは出るもののアップグレードやインストールは完了しています。
様子を見るしかありませんが、気になる場合は削除してしまいます。
1 2 3 |
sudo apt-get purge nvidia-l4t-bootloader sudo apt-get autoremove |
これによって再起動などをしても特段不具合が出ることもありません。
なんなんでしょう?謎です。
Leave a Reply