はじめに
公式ドキュメントにあるDockerコンテナ内でレシピを実行する方法を試してみました。
この記事はDockerの環境構築が終わっている前提で書いています。
Dockerが入っていない方はInstall Docker Engine | Docker Documentからインストールしてください。
また、windowsの方は「WSL2 + Nvidia container toolkit + WSL2内にdocker」を以下の記事を参考にそれぞれインストールしてください。
WSL2:windows10,WSL2でESPNetの環境構築【音声合成】- qiita記事
Nvidia container toolkit:Dockerを使って爆速でGPUを設定する方法 - qiita記事
WSL2内のdocker:wsl2にdocker, docker-composeをインストールする【メモ】 - qiita記事
リポジトリをクローンする
espnetでいろいろ学習を回すと100GBとか余裕でストレージを食うので、実験フォルダだけを別ストレージに退避しておくとか、余裕のあるストレージにcloneしておくことを推奨します。
git clone https://github.com/espnet/espnet
cloneするとespnetというフォルダが作成されます。
run.shを少し変更する
おそらく日本語TTS用に書かれていないので、そのままだと「pyopenjtalkないよ」というエラーで処理が止まります。なので、内部のレシピ実行前にpyopenjtalkをインストールするコマンドを挿入します。
以下のように、178行目の後ろにインストールコマンドを追加する処理を書きます。
cmd="pip install pyopenjtalk; ${cmd}"
これだと学習を実行するたびに毎回pipインストールが走るので、無駄な待ち時間が発生するので、もっとスマートなやり方がないか考えましたが、思いつきませんでした。有識者の方がいらっしゃったらコメントで教えていただけると助かります。
※謎のエラーが出たとき↓
Error utils/validate_data_dir.sh: text contains 7696 lines with non-printable characters
**espnet/egs2/TEMPLATE/asr1/utils/validate_data_dir.sh** の中のnon_print判定のところでこけているので、そこを直す。これが正しい治し方なのかはわからないが、これで動く。if locale -a | grep "C.utf8" >/dev/null; then
run.shを実行する
./run.sh --docker-gpu 0 --is-egs2 --docker-egs jsut/tts1
このコマンドで学習まで自動で実行されます。dockerイメージのpullからデータダウンロード、前処理など様々なタスクがあるので、学習が始まるまでもそこそこかかりますし、学習自体も2,3日くらいかかると思います。
おわりに
既存のレシピでハイパーパラメータを変えて実験する程度であれば問題ないと思いますが、自作のレシピを開発する場合や既存レシピを少し変えたい場合などはこの実行方法だと不便かなと思いました。
レシピ自作マンになりたい人は、つよつよLinuxマシンに直接インストールして開発しましょう。