tensoflowに興味があったし音楽の自動生成が面白そうだった
Pythonを知らなければtensorflowは技術記事で見かける機械学習のライブラリってイメージでした。触ったことがなくmagentaというを知って触ってみようと思いチュートリアルのようなものを探すと以下の記事が見つかりました。
人工知能時代の音楽制作への招待 - Google Magenta 解説&体験ハンズオン (自習編) -
ちょうどいいじゃん!と思って触るとcpuでのみの学習しか対応しておらず「機械学習はGPUの方が速度でるんでしょ?」という素人考えでDockerの勉強も兼ねて対応させることにしました。
forkしてGPUに対応させたリポジトリです。
MizoTake/magenta_session
##WSL上でDockerを使ってGPUを動かす環境を整える
自分はWindowsのPCにしかGPUを挿してなかったのでWSL2を使用してubuntuからnvidia-dockerを使用する手段を選びました。(Dockerのバージョンによってはnvidia-dockerをインストールしなくても大丈夫なそうですが自分の手元でうまくGPUを認識しなかったので使用しました)
magentaセットアップをWSLでしたら躓いてDockerの良さを再認識したメモ にぶち当たったエラーなどをメモ書き程度に書いています。これを今回はまとめて書く話になります。
WSL2は現在WindowsのOSをInsider Previewにしないと動きません。そのためリスクを負うことを理解して進めてください(Windowsを使わない場合は関係ないのでサクサクとdockerで準備ができていくと思います)
WSL2の準備は
待ってました CUDA on WSL2を順番にきちんとやればうまく動くと思います。cuda周りはDocker使わずやろうと思いましたが結構めんどくさかったのでDockerで動かすことを推奨します。
これは手元の環境によるかもしれませんがWSL2対応のlinuxをインストールしようとMicroSoft Storeからインストールしようとすると自分はうまくいきませんでした。そこで調べるとManually download Windows Subsystem for Linux distro packages
から落とせば、ストアを経由せずにダウンロードできました。ダウンロードした後も.appx
をダブルクリックするとダイアログが出て簡単にインストールすることができます。
DockerはWSL上で動かさないとGPUを使えないためWindowsのDockerは落としておく必要がありました。
DockerのイメージはTensorFlow Overviewここから持ってくるとcudaやtensorflowが包括されているので便利でした。
イメージをビルドして動かしたらPythonも最初から入ってるのでTensorFlowからGPUが認識できているかを2行コードで確認するを使ってGPUが認識されているか確認します。文字がでてきたら大丈夫です。
##magenta_sessionを最新のmagentaとtensorflow2に対応させる
magenta_sessionのソースコードは2~3年前と古く最新のmagentaやtensorflow2には対応していません、そのため当初は
- magenta_sessionのライブラリバージョンを基準にDockerを構成する
- magenta_sessionのライブラリバージョンを上げると共にmagenta_sessionの中身も更新する
の2択で迷っていました。結果2つ目で動かすことにするのですが何故1つ目にしなかったのかというと1つ目が動かなかったからです。tensoflow1のtensorflow-gpuなどもnvidiaのサイトのイメージにありますがGPUをうまく認識しなかったので断念しました。
- magenta==0.3.2 → magenta==2.1.0
- tensorflow==1.10.0 → tensorflow==2.2.0
が主なライブラリのバージョンアップです。tensorflowは後方互換があったのでそれを使うようにしていましたがmagentaはそれなりに変わっていたためちょっとだけ変更を追うのが大変でした。
tensorflowのバージョンアップ対応
tensorflowの対応は簡単で前述しましたが後方互換のおかげでプロジェクト内の文字列置換で基本済みました
Automatically upgrade code to TensorFlow 2を見ると自動的に処理をしてくれるものがあるみたいなのですが自分が気付いたときには対応した後で、行った対応は
-
import tensorflow as tf
→import tensorflow.compat.v1 as tf
だけだった気がします。magenta自体のtensorflow2対応を参考にしました。すんなり動いたので良かったです。
magentaのバージョンアップ対応
magentaの構造がちょいちょい変わっていたので参照する場所を更新すれば基本大丈夫でした
pipeline_instance = md.get_pipeline(config, md.FLAGS.eval_ratio)
を
pipeline_instance = md.melody_rnn_pipeline.get_pipeline(config, eval_ratio=md.FLAGS.eval_ratio)
にすることでまずはエラーが解消されるのですがこれは
melody_rnn_create_dataset.pyとmelody_rnn_pipeline.pyの中身をみるとpipelineの参照の方法やget_pipeline
メソッドの引数が変わったことが確認できたのでバージョンに合った指定にします。
graph = events_rnn_graph.build_graph("train", config, train_file)
graph = events_rnn_graph.build_graph("eval", config, eval_file)
の2つが古いメソッドでもうこの名前のメソッド名はありませんでした。そのためmagenta現行のメソッド名で呼び直します
graph = events_rnn_graph.get_build_graph_fn("train", config, train_file)
graph = events_rnn_graph.get_build_graph_fn("eval", config, eval_file)
とします、これはevents_rnn_graph.pyメソッド名が変わっただけのようで引数がそのままなので見つけやすかったです。
bundle=magenta.music.read_bundle_file(model_path))
↓
bundle=magenta.models.shared.sequence_generator_bundle.read_bundle_file(model_path))
今回はこれが一番苦労しました。現状(magenta==2.1.0)のmagenta/musicを見ると__init__.py
しかありません。そうmusicディレクトリには処理が一つもなくなっていました。(実際はmagentaのReleaseノートを見るとreleases/tag/2.1.0にmusicの処理はnote_seqに移動させたそうですが探しても目当てのものはありませんでした。)
そこで__init__.py
のコミット履歴をたどることにしました。tensorflow2の対応あたりを探すと見つかりました。Move generator_pb2 and sequence_generator out of musicここで目当てのread_bundle_file
は消されたことが分かりsequence_generator_bundle
を探すとディレクトリが移動させられたことがわかりました。これで現行の場所がわかったので確認します。sequence_generator_bundle.pyで見つかったので参照することで解決しました。
これで人工知能時代の音楽制作への招待 - Google Magenta 解説&体験ハンズオン (自習編) -
にあった生成までのコマンドが動きました。今回はsession部分には触れていないのでここまでの対応となります。(とにかく生成がしたかった)
##まとめ
今回はこれまででとりあえずmagenta_sessionがGPUを使って動くことが確認できました。
使用率が上がると楽しい(?) pic.twitter.com/udJSw8lBEb
— あるど (@OrangeGKeeper) August 14, 2020
結構ギリギリまでGPUが使われていることがわかります。もしこれで何か間違っていてGPUが使われていない学習が行われていたら卒倒しますね(白目)