GPT2 再挑戦して WSL で日本語文章を自動生成できた

日本語の文章を自動生成できる GPT2 Japanese。

以前やってみようと思ったんだけど上手く動かせなくて断念した。

「りんな」も何かモデルをオープンソース化したらしいのだが、手元の環境でどうやってそいつを動かすのかの細かい情報が全然なくて頭に来たので、りんなは無視して gpt2-japanese に再挑戦することにした。

ねぇねぇなんで機械学習とかこの手の界隈って Python や TensorFlow やライブラリ類の環境構築の説明省きまくるの?「皆分かってますよね?」感出して説明省くの止めろよ。Python なんてタダでさえ環境構築が上手く行かなくてキモいクソ言語なんだし、機械学習なんてブラックボックスに見える部分がどうしても多いんだから、人がやって再現性が高められるところはちゃんと再現性担保しろよ。もしかして皆各々の環境にデタラメに環境構築しててどうやって動かすのか分かってないから解説記事書けなかったりするの?Node.js 界隈見習え~。

目次

このページが参考になった

最終的に、以下のページが参考になったので、先に紹介しておく。

前回挑戦した時にこの記事があったら上手く行ったかもなぁ。

Windows GitBash 環境では上手くいかないから止めろ

色々こねこねしたんだけど、Windows GitBash・GitSDK 上では pyenv-virtualenv の環境構築が出来なかったので駄目だった。以下のログは失敗の記録なので、WSL 環境で上手く行ったログまで飛ばしてもらって良い。

$ 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
$ 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 系じゃないとダメだとか、情報が出てきた。

そこで、複数のバージョンの Python をインストールできる pyenv を入れてみようと思う。pyenv のプラグインで pyenv-virtualenv というモノもあり、コレも入れてやると、環境をさらに分けられるらしい。

コレまで自分は pipenv 一択やろーなんて思ってたんだけど、前回どうしても pipenv で上手く行かなかったので、参考文献のとおりに思考停止で真似してみる。

まずは 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
# コレでエラーは消えた

コレで 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 でやりましょう。

$ 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
$ 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 が出てしまった。でもコレは多分何かビルド系のライブラリを入れれば直るだろうな。

$ 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」みたいなキーワードでググって試してみた。

$ 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 というデスクトップマシンで、

といったスペック。もう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 環境

綺麗な 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 と依存ライブラリの準備手順

必要な依存ライブラリは次のとおり。

# 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 が動かせました。

その他見たページ

ホント Python 使いづれぇなぁ…。requirements.txt にバージョン番号もロクに書かれないし、なんたら env が多くてワケ分からん。いい加減なんとかしろよ。