見出し画像

ModalでApplio(RVC用WebUI)を動かす

初記事です


きっかけ

ModalというサーバレスでGPUが使えるサービスを去年のちょうど今頃知ってずっと触ってなかったんですけど、なんか無料枠に神アプデがきてるっぽく、「毎月付与クレジットの増加」「ストレージ利用料タダ(!?)」となっている気がしたので重い腰を上げて触ってみることにしました。

クレカ登録しなくても毎月$30付与は嬉しいですね。

「ストレージ利用料タダ」についても公式Slackにそういう記述があったので間違いなさそう。そのうちまた有料化するらしいけど。
Plan Pricing | ModalによるとSlackへのアクセスはModal利用者限定らしいのでスクショ貼るのは一応控えます。
※でも実はgithubに普通にSlackへのリンクが載ってるので誰でも見れる…🤔
Modalについてはそんな感じ。

RVCも去年の今頃、中国語WebUIに四苦八苦しながらGoogle ColabでRVC v1モデルを何個か作って以来触れてなかったのですが、UIの改善や優秀な事前学習モデルの登場などにより環境が整ってきたと聞いたので再度遊びたくなった所存です。
今回はApplioという最近主流らしいUIを使っていきます。

(GPUなしで超低遅延AIボイチェンみたいな技術も最近いくつかあるらしく気になってます)

ソースコード

GitHubに置いてあります。諸々の起動方法は基本的にREADMEの通りです。

学習してみた

Applioの操作方法やTensorboardの見方はここでは解説しません(放棄)。上に貼ったApplio公式ドキュメントを参考にして下さい。
今回は学習用データセットに東北イタコのITAコーパスと歌唱データベースを使いました。

学習時の設定内容はスクショで以下に貼っておきます。

- KLMv7s_Batch4_48kという事前学習モデルを使用。なんか最近出たやつ。
- Overtraining Thresholdをデフォルト値の50エポックに設定。50エポックの間改善がないと判断されると自動で学習停止するらしい。

データセット前処理から学習終了まで4時間ほど、$5.08消費しました。CPU、RAM、VRAMなどの使用状況推移はこんな感じ。GPUはT4です。
なんでコンテナの数ずっと0の扱いなんだ…?🤔

Tensorboardも残しておきます。どの指標が何を表しているか正直分かってないけどなんかまだ下がりそうなのであとで追加学習するかも。

完成したモデルとindexファイルはストレージに保存するようにしてあるので、ダッシュボードから確認できます。

ただしこの画面からダウンロードする機能は今のところなくCLIコマンドを叩く必要があります。

modal volume get [OPTIONS] VOLUME_NAME REMOTE_PATH [LOCAL_DESTINATION]

modal volume | Modal Docs

(Slackで「ダッシュボードからもファイル操作できるようにしてくれ〜」と要望を投げたら対応していただけそうな返答をもらったのでそのうち実装されるかも)

RVCテスト

試しにInferenceタブからセリフとボーカルの音源を投げて変換してみます。
結果↓

いい感じですね!(吾輩は猫であるのほうは私の地声からの変換。結構低音なのでpitch+20してますがかなり良いのでは。1年前はカスカスでした。)

ちょっと極端な発声も試してみます。

少しかすれてますが許容範囲かなと思います!

Modalに関する注意点

  • 通常、何も処理をしていないコンテナは一定時間 (@app.clsの引数container_idle_timeoutに設定した秒数) で自動的に停止して待機状態になります。おかげで停止忘れからの課金額爆発コンボを回避できるはずなのですが、今回のApplioのほうではなぜかそれが機能しません (Tensorboardのほうでは機能します)。やりたいことが終わったらすぐコンテナを手動で止めましょう。
    ダッシュボードから該当のAppを選んでStopボタンクリックで止まります。modal serveで起動した場合はコンソールからCtrl+CでもOKです。

  • …でも学習中ずっと画面の前に張り付いてるわけにもいかないので、学習終了を検知してコンテナを強制的に止めるスクリプトをmodal_applio_stopper.pyとして用意しました。なるべく使用をお勧めします。

立ち上がってるコンテナ、GPUの数はダッシュボード右上の「Live Usage」から見れます。最新状況の反映まで時間がかかる場合もあります (と言っても長くて1分くらい?)。
  • やったことないので憶測ですが24時間を超える処理はたぶん中断されます。@app.clsの引数timeoutで1処理あたりのタイムアウトを設定でき、その最大値が24時間のため。


参考記事

この記事が気に入ったらサポートをしてみませんか?