GPT2 再挑戦して WSL で日本語文章を自動生成できた
日本語の文章を自動生成できる GPT2 Japanese。
以前やってみようと思ったんだけど上手く動かせなくて断念した。
「りんな」も何かモデルをオープンソース化したらしいのだが、手元の環境でどうやってそいつを動かすのかの細かい情報が全然なくて頭に来たので、りんなは無視して gpt2-japanese に再挑戦することにした。
- rinna社、日本語に特化したGPT-2の大規模言語モデルを開発しオープンソース化 |rinna株式会社のプレスリリース
- AIチャットボット「りんな」を手がけるrinnaが日本語特化のGPT-2大規模言語モデルをオープンソース化 | TechCrunch Japan
- rinnakk/japanese-gpt2: Code for producing Japanese GPT-2 provided by rinna Co., Ltd.
- Huggingface Transformers 入門 (27) - rinnaの日本語GPT-2モデル|npaka|note
pip
コマンドが紹介されてて、ちょっとだけ真似しやすそう
ねぇねぇなんで機械学習とかこの手の界隈って Python や TensorFlow やライブラリ類の環境構築の説明省きまくるの?「皆分かってますよね?」感出して説明省くの止めろよ。Python なんてタダでさえ環境構築が上手く行かなくてキモいクソ言語なんだし、機械学習なんてブラックボックスに見える部分がどうしても多いんだから、人がやって再現性が高められるところはちゃんと再現性担保しろよ。もしかして皆各々の環境にデタラメに環境構築しててどうやって動かすのか分かってないから解説記事書けなかったりするの?Node.js 界隈見習え~。
- gpt2-japaneseのmediumモデルで架空のNAIST生をD進させてD進後の状況を独白してもらう - Seitaro Shinagawaの雑記帳
- 超説明足りなくて素人の助けにならない例
目次
- このページが参考になった
- Windows GitBash 環境では上手くいかないから止めろ
- WSL でやりましょう
- 動くようになった
- ワーニングメッセージを非表示にする
- もう少し動作確認してみる
- 所感
- まとめ
- その他見たページ
このページが参考になった
最終的に、以下のページが参考になったので、先に紹介しておく。
前回挑戦した時にこの記事があったら上手く行ったかもなぁ。
Windows GitBash 環境では上手くいかないから止めろ
色々こねこねしたんだけど、Windows GitBash・GitSDK 上では pyenv-virtualenv の環境構築が出来なかったので駄目だった。以下のログは失敗の記録なので、WSL 環境で上手く行ったログまで飛ばしてもらって良い。
- GitSDK で検証した。事前環境
- この時は気付いていなかったのだが、Python 3.7.4 な時点で、gpt2-japanese が想定する環境は動かないらしい
$ type python
python はハッシュされています (/usr/bin/python)
$ type python3
python3 は /usr/bin/python3 です
$ type python2
python2 は /usr/bin/python2 です
$ python --version
Python 3.7.4
$ python3 --version
Python 3.7.4
$ python2 --version
Python 2.7.17
- gpt2-japanese を入れてみる
$ git clone https://github.com/tanreinama/gpt2-japanese
$ cd ./gpt2-japanese/
# 1.2GB 程度。2分程度で DL した
$ wget https://www.nama.ne.jp/models/gpt2ja-medium.tar.bz2
$ tar xvfj gpt2ja-medium.tar.bz2
# 公式の README にもある動作確認用のコマンド。pip で何も入れていないので当然何も動かない
$ python3 gpt2-generate.py --model gpt2ja-medium --num_generate 1
Traceback (most recent call last):
File "gpt2-generate.py", line 3, in <module>
import numpy as np
ModuleNotFoundError: No module named 'numpy'
# tensorflow v1.14 を入れようとするも失敗。
$ pip install tensorflow==1.14
ERROR: Could not find a version that satisfies the requirement tensorflow==1.14 (from versions: none)
ERROR: No matching distribution found for tensorflow==1.14
この辺は前回も失敗していたので、案の定ダメだった。調べてみると、pip
のバージョンが古いとこうなるとか、Python v3.6 系じゃないとダメだとか、情報が出てきた。
- pipでtensorflowのインストールに詰まった時は - すこたのブログ
-
Pythonのバージョンが3.7.0だとTensorFlowが対応しておらずimport errorが発生するみたいです。
僕も実機で確認しました。
対応策としてはPyhtonを3.6.6にダウングレードするのが一番安全とのことです。
-
そこで、複数のバージョンの Python をインストールできる pyenv
を入れてみようと思う。pyenv のプラグインで pyenv-virtualenv
というモノもあり、コレも入れてやると、環境をさらに分けられるらしい。
コレまで自分は pipenv 一択やろーなんて思ってたんだけど、前回どうしても pipenv で上手く行かなかったので、参考文献のとおりに思考停止で真似してみる。
- pyenv/pyenv: Simple Python version management
- pyenv。
- pyenv/pyenv-installer: This tool is used to install
pyenv
and friends.pyenv
を自動インストールできるプロジェクトもあったのだが、中でやっていることはほぼ一緒。結果、これも上手くいかなかった- https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer
まずは pyenv
を普通に入れてみる。
# Windows GitSDK で ↓ コレを入れても動かないのだが、この時は気付いていなかった
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 以下3行を追記した
$ vi ~/.bashrc
export PYENV_ROOT="${HOME}/.pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"
# 後述するシンボリックリンク作成に失敗している件
$ source ~/.bashrc
/c/Users/Neo/.pyenv/bin/pyenv: 行 1: ../libexec/pyenv: No such file or directory
# `export MSYS` を `~/.bashrc` に追記し、GitSDK を「管理者権限」で開いたあと、シンボリックリンクを貼る
$ rm ~/.pyenv/bin/pyenv
$ ln -s ~/.pyenv/libexec/pyenv ~/.pyenv/bin/pyenv
# コレでエラーは消えた
- Python環境の構築 | Instruction of chemoinformatics by funatsu-lab
~/.bashrc
に追記するexport
とeval
文
- windows + cygwin で pyenv の環境構築 - 今からお前んちこいよ
/path/to/.pyenv/bin/pyenv: line 1: ../libexec/pyenv: No such file or directory
-
シンボリックリンクを貼るのに失敗しているのが原因。貼り直してあげる。
- Windows10 - Git Bashでシンボリックリンクをつくれるようにする - LOGICKY BLOG
-
シンボリックリンクではなく、コピーが作成される
-
下記2点を実施したらできるようになった。
export MSYS=winsymlinks:nativestrict
-
git bashを管理者権限で開く
-
コレで pyenv
コマンド自体は動くようになった。このあと $ pyenv virtualenv
コマンドを使いたいのだが、サブコマンド virtualenv
は、pyenv プラグインである pyenv-virtualenv
を入れないといけない。
$ pyenv -v
pyenv 1.2.26-3-gc010935a
$ pyenv versions
* system (set by /c/Users/Neo/.pyenv/version)
# virtualenv がないので入れる
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
# 以下1行を追記する
$ vi ~/.bashrc
eval "$(pyenv virtualenv-init -)"
# まずは pyenv で対象の Python バージョンを入れる
$ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
BUILD FAILED (MSYS_NT-10.0-21343 3.0.7-338.x86_64 using python-build 1.2.26-3-gc010935a)
Inspect or clean up the working tree at /tmp/python-build.20210409173145.3629
Results logged to /tmp/python-build.20210409173145.3629.log
Last 10 log lines:
981 | PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
| ^~
./Include/tupleobject.h:62:75: 備考: in definition of macro ‘PyTuple_SET_ITEM’
62 | #define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v)
| ^
./Modules/signalmodule.c:981:5: 備考: in expansion of macro ‘PyStructSequence_SET_ITEM’
981 | PyStructSequence_SET_ITEM(result, 6, PyLong_FromLong(si->si_band));
| ^~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [Makefile:1761: Modules/signalmodule.o] エラー 1
make: *** 未完了のジョブを待っています....
…ということで、$ pyenv install
コマンドがそもそも動かず、$ pyenv virtualenv
に辿り着けず。
調べたら pyenv-win
という Windows 用の pyenv があるようなので、コレを入れることにする。上で構築した ~/.pyenv/
ディレクトリは全削除。~/.bashrc
に追記したモノも全消し。
# GitSDK で作業
$ git clone https://github.com/pyenv-win/pyenv-win.git "$HOME/.pyenv"
# 「システムの詳細設定」→「環境変数」で見られる環境変数を PowerShell から追加する
[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
[System.Environment]::SetEnvironmentVariable('PYENV_HOME',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
[System.Environment]::SetEnvironmentVariable('path', $HOME + "\.pyenv\pyenv-win\bin;" + $HOME + "\.pyenv\pyenv-win\shims;" + $env:Path,"User")
# 再度 GitSDK で作業
$ pyenv --version
pyenv 2.64.3
$ pyenv rehash
$ pyenv update
$ pyenv install 3.6.3
$ pyenv global 3.6.3
…ココまでやって、Python のバージョン切り替えがなぜか成功せず。pyenv-virtualenv
を導入してみてもコチラも動かないなど、どうにも思いどおりにならず、諦めた。
WSL でやりましょう
というワケで、WSL でやりましょう。
- WSL の環境確認
$ type python
python はハッシュされています (/usr/bin/python)
$ python --version
Python 3.6.9
$ type python3
python3 は /usr/bin/python3 です
$ python3 --version
Python 3.6.9
$ type python2
python2 は /usr/bin/python2 です
$ python2 --version
Python 2.7.17
- pyenv-installer でインストールしてみる
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# 以下3行を追記する
$ vi ~/.bashrc
export PATH="${HOME}/.pyenv/bin:${PATH}"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
# 更新
$ exec $SHELL
$ pyenv rehash
$ pyenv update
# Python v3.6.3 をインストールする
$ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
BUILD FAILED (Ubuntu 18.04 using python-build 20180424)
Inspect or clean up the working tree at /tmp/python-build.20210409175658.1995
Results logged to /tmp/python-build.20210409175658.1995.log
Last 10 log lines:
ensurepip._main()
File "/tmp/python-build.20210409175658.1995/Python-3.6.3/Lib/ensurepip/__init__.py", line 189, in _main
default_pip=args.default_pip,
File "/tmp/python-build.20210409175658.1995/Python-3.6.3/Lib/ensurepip/__init__.py", line 102, in bootstrap
_run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
File "/tmp/python-build.20210409175658.1995/Python-3.6.3/Lib/ensurepip/__init__.py", line 27, in _run_pip
import pip
zipimport.ZipImportError: can't decompress data; zlib not available
Makefile:1079: recipe for target 'install' failed
make: *** [install] Error 1
おや、WSL でも BUILD FAILED
が出てしまった。でもコレは多分何かビルド系のライブラリを入れれば直るだろうな。
- WSL pyenvへのPythonインストールで出るエラーを解決する | Output 0.1
- このサイトで紹介されているパッケージを
apt
で全部入れる
- このサイトで紹介されているパッケージを
$ apt install build-essential zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
Installed Python-3.6.3 to /home/neo/.pyenv/versions/3.6.3
インストールできた。
$ pyenv global 3.6.3
$ python --version
Python 3.6.3
$ python3 --version
Python 3.6.3
$ python2 --version
Python 2.7.17
$ pyenv virtualenv 3.6.3 gpt2_ja
こうして Python 3.6.3 環境がなんとか構築できた。
# GitSDK 環境でやっていたことを WSL でやり直す
$ git clone https://github.com/tanreinama/gpt2-japanese
$ cd ./gpt2-japanese/
$ wget https://www.nama.ne.jp/models/gpt2ja-medium.tar.bz2
$ tar xvfj gpt2ja-medium.tar.bz2
# pip 何もしてないので動作確認コマンドは当然動かない
$ python3 gpt2-generate.py --model gpt2ja-medium --num_generate 1
# ようやく TensorFlow のインストールが成功した
$ pip install tensorflow==1.14
$ python3 -c 'import tensorflow as tf; print(tf.__version__)'
1.14.0
この後、動作確認コマンドを実行すると numpy に関する in a future version of numpy, it will be understood as
なエラーが出た。
エラーメッセージでググると以下が出た。TensorFlow と一緒にインストールされる numpy のバージョンが合わないらしい。
# numpy のバージョンを指定して入れ直す
$ pip uninstall numpy
$ pip install numpy==1.16.4
ココから先は、冒頭に紹介した
コチラの記事と同じ挙動になったので、確認しながら一つずつ依存ライブラリを pip
で入れてやった。
# tqdm エラーに変わった
$ python3 gpt2-generate.py --model gpt2ja-medium --num_generate 1
Traceback (most recent call last):
File "gpt2-generate.py", line 6, in <module>
from tqdm import tqdm
ModuleNotFoundError: No module named 'tqdm'
$ pip install tqdm
# jaconv エラーに変わった
$ python3 gpt2-generate.py --model gpt2ja-medium --num_generate 1
Traceback (most recent call last):
File "gpt2-generate.py", line 8, in <module>
from encode_bpe import BPEEncoder_ja
File "/home/neo/Documents/Dev/Sandboxes/gpt2-japanese/encode_bpe.py", line 2, in <module>
import jaconv
ModuleNotFoundError: No module named 'jaconv'
$ pip install jaconv
動くようになった
そして、ついに動作するようになった。
$ python3 gpt2-generate.py --model gpt2ja-medium --num_generate 1
2021-04-09 18:23:42.091760: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2021-04-09 18:23:42.097109: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 4199995000 Hz
2021-04-09 18:23:42.097856: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55bf72e73860 executing computations on platform Host. Devices:
2021-04-09 18:23:42.097893: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): <undefined>, <undefined>
WARNING:tensorflow:From /home/neo/Documents/Dev/Sandboxes/gpt2-japanese/sampling.py:79: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.cast` instead.
WARNING:tensorflow:From /home/neo/Documents/Dev/Sandboxes/gpt2-japanese/sampling.py:16: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:From /home/neo/Documents/Dev/Sandboxes/gpt2-japanese/sampling.py:84: multinomial (from tensorflow.python.ops.random_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.random.categorical` instead.
WARNING:tensorflow:From /home/neo/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorflow/python/training/saver.py:1276: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.
Instructions for updating:
Use standard file APIs to check for files with this prefix.
2021-04-09 18:23:47.574003: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set. If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU. To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
「私に隠し事はないですよ」
「お話しながらでも楽しんでいただけましたか?」
「ふふ、ありがとうございます」
嬉しそうに笑う彼女に、俺は笑顔で答える。
彼女は本当に自分から話したがるからな。
「……お茶でも頂いて、お話しましょうか」
「お茶、ありがとうございます。では、お言葉に甘えて」
お茶請けを頂きながら、彼女の身の上話を聞く。
それを終えると、お茶を頂きながら彼女と二人っきりになる。彼女はソファで、俺は少しはみ出しているソファだ。
「…………」
「…………」
俺の言葉に沈黙。
「……私に隠し事があって……その……」
「…………」
「…………」
沈黙に耐え切れなくなった俺は、そのままソファに腰を下ろして俺の視線から彼女を逃がす。お茶、いただきます。そう言って彼女を見ると、彼女はこちらを真っ直ぐ見つめ、手でソファの脚を掴むと、俺の下に下ろす。
「私の事を知りたがっていましたね?」
「そ、それは……まぁ」
「なら」
「えっ」
「――私と、お付き合いしてください」
「っ……!?」
俺の予想もしなかった告白の言葉に、彼女は驚いて目を大きく見開いている。
彼女と付き合えるのなら、この想い、どうし
動作確認コマンドを動かした結果が上のとおり。テキストが出力されるまで1・2分くらい待たされた上に、ワーニングメッセージが出ているのが気持ち悪いが、とりあえず出来た出来た。
ワーニングメッセージを非表示にする
続いて、TensorFlow のワーニングメッセージがうるさいから消してみる。メッセージでググったり、「Hide TensorFlow Warning Message」みたいなキーワードでググって試してみた。
- python - Disable Tensorflow debugging information - Stack Overflow
- TF 1.x: remove the "deprecated" warning messages · Issue #27023 · tensorflow/tensorflow
- この辺を参考にした
$ vi ./gpt2-generate.py
import json
import os
import numpy as np
import tensorflow.compat.v1 as tf
import argparse
from tqdm import tqdm
from sampling import sample_sequence
from encode_bpe import BPEEncoder_ja
# ↑ココマデ既存部分
# ↓以下を追記
from tensorflow.python.util import deprecation
deprecation._PRINT_DEPRECATION_WARNINGS = False
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
# ↑追記ココマデ
# ↓既存部分再開
if int(tf.__version__[0]) > 1:
from model import HParams as HParams
else:
from tensorflow.contrib.training import HParams
# 以下略…
こんな風に、gpt2-generate.py
の冒頭に、TensorFlow の Deprecation に関するワーニングを非表示にするフラグ設定と、環境変数 TF_CPP_MIN_LOG_LEVEL
によるログレベルの調整を追加してやった。
もう少し動作確認してみる
今度は --context
オプションを利用して、書き出しの文章を指定しながら動作確認してみる。
$ python3 gpt2-generate.py --context='こんにちは、Neoです。' --num_generate=1
私はこれ以上ないほど、幸せです。 なんか、悲しい。
ワーニングメッセージが出なくなった。コマンドを実行してから1・2分ほど待って、一つの文章が出てきてプロンプトが戻った。スゴく悲しい文章が自動生成された。
試しに time
コマンドで実行時間を計ってみる。
$ time python3 gpt2-generate.py --context='こんにちは、Neoです。' --num_generate=1
今は、ちょっとしたことでも、ワクワクできますよね。 それは、「家も片付いてないから」ではありません。 今日は、お金も、稼げないのに、なんで、もって行かれるの?そんな、思いでも立ち上がりませんか?(((o(*゚▽゚*)o))) そういえば、我が家には、子供がいないのに家がない、と言っている方がいらっしゃいます。 はい、そのとおりです! 家は片付けられない、と言うより、片付けられないんです。 片付けようと思っても、結局、片付けられないんです。 片付けにくいと、子供がいると、それは、子供にいじめられているんだ、と思ってしまい、 自分から、自立を促してしまうのです。 例えば、私の場合。 私が子連れで、我が家に来てくれたりしたから、それで、「あ〜、何でこんなことになったんだろう」という現実が出てきて 「私がここにいて、何が悪い!誰が一番だと思っているんだ、私は、 私は何が知りたいんだ、と。」 と、思いきって、「お金を稼がないと、自分に反します」という、子供のために、自分を殺して逃げてしまいました。 こんな思いで、「お金を稼がなき
real 1m0.494s
user 1m51.633s
sys 0m24.123s
1分51秒。約2分くらい待たされてますね。
今度はもう少し違う文章を与えてみる。
$ time python3 gpt2-generate.py --context='映画を観るのが好きな俺が新たに探している趣味は、'
『アクション映画』だ。それも今期の新作の──といっても、『タイムリープ』みたいなもんだが──アニメでも観れば面白いと思う。最近観たアニメと言えば、「ジョジョの奇妙な冒険 ダイヤモンドは砕けろ」や「ダンガンロンパシリーズ」の──これまた俺は観たことがないので、観るというよりは観させてもらおう。俺は、最初に観た作品も覚えていなくて、どうせ観たら見る、くらいの気持ちで観ていた。
今期の続編として、「スター・トレック バトル&ドラゴンズ」では、『タイム』がある。「スター・トレック」とは言うけれど、これもファンには分かりづらいようだ。今期のスター・トレックには原作に沿わないにしてもやはり『ジョジョの奇妙な冒険』という ことで、「スター・トレック」に似せた作品がある、と「スター・トレック」原作の脚本家が言っていたらしい。どうやら、その脚本家が出したのが原作のシナリオということが多いらしい。
俺は今期の新キャラクターであるマリー・アントワネットの映画を観てから、新たに「スター・トレック」のタイトルが観たいとかアニメ化された「ライアー」を観るような気分である。
これが現在俺は観たいアニメのひとつなのであ
========
日本映画の鑑賞か、それに近いものあるみたいだな……」
と、言って、今の今まで、俺は、この映画の続編とか、その続編、新しい奴が来そうな、映画も観にいかないか、と言う考えを持っていた。
「もしかしたら、今、俺が、観ているのも、そういう映画なのかもしれないな……」
そう俺が呟くのと同時に、チャポンというチャッタンから、チャッタンに届いた音声が、
『さあ、皆さん、始めましょう。お時間はありますか?』
という、何か、嫌な感じの声だった。
「いや、まだ……」
「今、チャッタンに届いたのですが……なにか聞こえますか?」
「うん、聞こえないけど、でも、確かに何か聞こえる。何だろう……」
と、俺は言って、チャッタンに続いて、チャッタンに届いたチャッタンのチャッタンも、俺と同じ方向を向いて、チャッタンのチャッタンも、俺と同じ様に向いて、チャッタンのチャッタンも、何かチャッタンが動いているけど、音も音も聞こえない、と言う音も してこない、と言った感じもして、チャッタンのチャッタンも、チャッタンのチャッタンもでて、チャッタンコンサートは行われる様になった。チャッタンも、チャッタンも何もしないから、チャッタンが動
========
絵を描くことでしょう」
「確かに絵を書きたい、と思うことはあるな」
彼の言葉を聞いて、その趣味の持ち主が何を言っているかを察した、と同時に、彼の口ぶりから彼の趣味が美術に対する趣味であり、さらに趣味に没頭するために美術館に通っている理由が何か、何となく察しがついた。
「それにしても、お前は何で絵を描いてるの」
「何でって、芸術って言ったら、芸術の事だよな」
「どういう事だ?」
「俺にも分からん。分からんのだろうが、この国で芸術が発達してるのは、美術館、芸術関係者、またはその類の人たちは、必ずこの都市、つまりここに集まる。俺の言う芸術とは、その人たち全員が関わってる芸術、つまり芸術家(プロフェッサー)が手がける 芸術だ」
「プロフェッサー、つまり、この国で生き延びるためのプロフェッサー、か。なるほど、分かりやすい言い方だな」
「ああ、そうだ。例えば、俺の絵は今俺が置かれている状況や、今俺が置かれている環境の様に生き延びるための何か、そういうものを描いてる事になるんだ」
「生き延びるために?……それで私に何を望むんだ?」
「ああ、それは俺の考えてる事だから、お前からすれば分からんものなんだろ
========
それこそ小説と映画だ。
映画って映画を観るという感覚が、どうして俺の中にあるのだろう。
映画を観ているという感覚よりも映画を観て、小説って感じを味わう方が、俺の中で大きな衝撃を受けていたのは、確かだ。
========
アニメ鑑賞。でもそれはとても危険なモノで、アニメ鑑賞の後は寝る時間をズラしても、寝る時はあるアニメを観る時間。そう、俺は睡眠時間を削るのが好きなので、寝る時はあるアニメを観る時間をズラしているのだ。なのに、何故アニメ鑑賞の時は寝る時間を ズラして、眠る時はアニメを観ないのか?……俺には、その理由が分からない事ばかりだ。
「んー、なんでやねん?」
「…………?」
「そんな不満そうな顔すんな、ほんま知らんけど。あ、そう! なんでやねん、って言うたか忘れた。なんでや?」
「……あー。その、なんでってなんかよく分からないけど、なんでやねん……?」
この反応に、本当に自分が馬鹿らしくなってきてしまい気が付けば、少し前までの俺は、何をしにきていたのか考えなくてはいけない。そもそも、俺はアニメを観るという目的があって、それに自分が付き合っていたのだとすら思えてくるのに、何故自分が観に来 ているのか、俺には分からない。
「はぁ? せやったら寝ぼける前に、何も言わずに付き合ってくれてるんか? ほな何もしてへんやろ、それとも何もしてへんか?」
「ほ? あ、そのことなんやけど、えっと……」
「せやなあ。せやった
real 4m27.822s
user 8m50.885s
sys 1m51.457s
何パターンか生成してくれた。1・2分ごとに1パターンの文章が出力されて、全部で9分ほど掛かった。
所感
ようやく gpt2-japanese が動かせた…。確かに、与えた文章に関連する文章がゴロゴロと生成されるのは面白い。が、与える文章が短かったりすると、大した精度が出ないんだなぁと思った。
gpt2-generate.py
の中を見ると色々なパラメータがある。これらのパラメータ調整もそうだろうし、事前にどんな学習をさせてどうモデルを作るかとか、そういう機械学習の基礎的な視点で色々と考慮・調整すべきところは沢山あるんだろうな。そういうことが全然分からないまま、「とりあえず TensorFlow とかいうヤツで機械学習できるんでしょ?」ぐらいのノリで触ると、まぁこの程度の出力しか得られないということだな。
検証に使用したマシンは、2017年に購入した Galleria XG というデスクトップマシンで、
- CPU : Core i7-7700K
- RAM : 32GB
- GPU : GeForce GTX 1080
といったスペック。もう4年前になるが、当時はかなり高スペックな部類のマシンだったのだが、それでも1つの文章の生成には1・2分掛かった。
完全に素の Ubuntu ではなくて WSL 環境という部分で、オーバーヘッドがあるのかもしれないし、割り当てられてるマシンリソースが 100% じゃないのかもしれない。
また、依存ライブラリとしてインストールしたのが tensorflow
v1.14 で、tensorflow-gpu
ではなかったので、GPU は使われず CPU のみで処理されたと思われる。GPU を使ったらもう少し速いのかしら?でももう一度動くように整えられた環境を変更したくねぇなぁ…。Windows ホスト側で認識している GPU を、WSL で透過的に扱えるのかしら?よく知らないし調べるの面倒臭い。
最近公開された「りんな」の情報を見ると、何かまた違うライブラリを入れるみたいで、それらの依存ライブラリが既存環境を消してしまうとも限らない。やる気が出たら、pyenv-virtualenv
でしっかり環境を分けて試してみようかしら。
まとめ
とりあえず gpt2-japanese が動かせるようになったので、Python・TensorFlow 素人として欲しかった、初歩の初歩の情報を以下にまとめる。
gpt2-japanese を動かすために必要な OS・Python 環境
- OS : Ubuntu 18.04 (WSL で良い)
- GitBash では pyenv 周りでつまづいてダメでした
- Python : v3.6.3 (v3.7 系だと、依存する TensorFlow v1.14 が導入できないため、v3.6 系が必要)
綺麗な Python v3.6.3 環境を用意するために : pyenv を入れる
# 先に `$ pyenv install` 実行時に必要な依存パッケージをインストールする
# Ubuntu 前提で書いているので、OS も Ubuntu (≒ WSL) だと楽だと思うよ
$ apt install build-essential zlib1g-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
# pyenv と pyenv-virtualenv プラグインを一気に入れられるインストーラを使う
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# 以下3行を `~/.bashrc` に追記する
echo 'export PATH="${HOME}/.pyenv/bin:${PATH}"' >> "${HOME}/.bashrc"
echo 'eval "$(pyenv init -)"' >> "${HOME}/.bashrc"
echo 'eval "$(pyenv virtualenv-init -)"' >> "${HOME}/.bashrc"
# 変更を反映して初期準備する
$ exec $SHELL
$ pyenv rehash
$ pyenv update
# Python v3.6.3 をインストールする
$ pyenv install 3.6.3
# システム全体で v3.6.3 を利用する
$ pyenv global 3.6.3
$ python --version
Python 3.6.3
$ python3 --version
Python 3.6.3
# pyenv-virtualenv で環境を作る場合は以下のように打つ (今回実はコレで用意した環境を使っていない)
$ pyenv virtualenv 3.6.3 gpt2_ja
# pyenv で導入した環境一覧、および使用中のバージョンを確認する
# 先頭にアスタリスク `*` が付いているのが使用中のバージョン
$ pyenv versions
gpt2-japanese と依存ライブラリの準備手順
必要な依存ライブラリは次のとおり。
- TensorFlow : v1.14
- numpy : v1.16.4
- tqdm : v4.60.0 (
$ pip install tqdm
で入れられた) - jconv : v0.3 (
$ pip install jaconv
で入れられた)
# GitSDK 環境でやっていたことを WSL でやり直す
$ git clone https://github.com/tanreinama/gpt2-japanese
$ cd ./gpt2-japanese/
$ wget https://www.nama.ne.jp/models/gpt2ja-medium.tar.bz2
$ tar xvfj ./gpt2ja-medium.tar.bz2
# 以下の動作確認コマンドを叩いてエラーメッセージを確認しながら、必要なライブラリを `pip` で入れていくと確実だろう
$ python3 ./gpt2-generate.py --model gpt2ja-medium --num_generate 1
# TensorFlow
$ pip install tensorflow==1.14
$ python3 -c 'import tensorflow as tf; print(tf.__version__)'
1.14.0
$ pip uninstall numpy
$ pip install numpy==1.16.4
$ pip install tqdm
$ pip install jaconv
# `pip` でインストールしたライブラリとバージョンの一覧を確認する
$ pip list
ココまで作業すれば gpt2-japanese の動作確認コマンドが動作するようになるはず。
gpt2-generate.py
のワーニングメッセージを非表示にする
gpt2-generate.py
の冒頭部分に、以下のように3行ほど追記する。
import json
import os
import numpy as np
import tensorflow.compat.v1 as tf
import argparse
from tqdm import tqdm
from sampling import sample_sequence
from encode_bpe import BPEEncoder_ja
# ↑ココマデ既存部分
# ↓以下を追記
from tensorflow.python.util import deprecation
deprecation._PRINT_DEPRECATION_WARNINGS = False
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
# ↑追記ココマデ
# ↓既存部分再開
if int(tf.__version__[0]) > 1:
from model import HParams as HParams
else:
from tensorflow.contrib.training import HParams
# 以下略…
以上!!!
Python・TensorFlow 素人でも何とか gpt2-japanese が動かせました。
その他見たページ
- GPT-2におけるテキスト生成 - Stockmark Tech Blog
- gpt2-japaneseの使い方 (2) - GPT-2のファインチューニング|npaka|note
- Google Colaboratory というブラウザ上で Python を動かせるサービスを使って検証している
- hppさんはTwitterを使っています 「日本語GPT-2は現在おそらく3種類存在している https://t.co/lGQxPl8Rv7 https://t.co/6kNEokWcJv https://t.co/KpX8fTYQFP」 / Twitter
- 【日本語モデル付き】2021年に自然言語処理をする人にお勧めしたい事前学習済みモデル - Qiita
- HuggingFace という会社の Transformers というフレームワークがあったりするらしい
- T5 : Text-To-Text Transfer Transformer。T5 は Google のモデル
- huggingface/transformers の日本語BERTで文書分類器を作成する - Qiita
- GPT-2で文章生成を試してみた - Qiita
-
gpt-2-simpleは、openaiのGPT-2をベースにしているので、tensorflow2.x系では動きません。
Dockerのイメージを利用する場合はtensorflow/tensorflow:1.15.2-py3
を利用しましょう(CPUの場合)。
GPUを利用する場合
windows上のdockerでは動作しないようです...
-
ホント Python 使いづれぇなぁ…。requirements.txt
にバージョン番号もロクに書かれないし、なんたら env が多くてワケ分からん。いい加減なんとかしろよ。