MMVCローカル学習環境を用意する（暫定版,WSL2使用)

## 注意：最新の環境構築については本家Githubをご確認ください！

ありがたいことに、本記事の内容が公式に取り込まれ、複数人の手によって更新されることになりました。
**この記事の内容は既に古く、今後更新もされないので今後は以下のページをご確認ください。**

https://github.com/isletennos/MMVC_Trainer/wiki/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

せっかく書いた記事を消すのも悲しいので、記事は残します。

## 概要

MMVCとはAIを使ったリアルタイムボイスチェンジャーで、自身の声と対象の声を機械学習することでリアルタイムでボイスチェンジを可能にするソフトウェア。
google colaboratoryを用いることで、個人の環境に依存せず簡単に機械学習の学習フェーズが実行可能である。

いろいろと試すうちにgoogle colabratoryの無料枠を使い切り、かつローカル環境にそれなりに強いGPUがあったため、ローカルでの学習環境を構築することにした。

この記事では、

- ローカルのWindows11PCのWSL2上に
- 機械学習用の環境を用意し
- MMVCで利用する機械学習データを作成する

までに実施した内容を整理しメモする。

**この記載内容は暫定版です。自分用のメモに多少手を加えた程度なので期待しないでください。**

## 追記

- 2022-08-13: 最新版(v1300)リリースされましたが、ほぼバグフィックスなのでこの内容で動作するはずです。
- 2022-08-11: 最新版(v1220)リリースに伴う修正
  - 動画へのリンクからシリーズへのリンクに変更
  - githubのReadmeに合わせた記述の順序修正(2-2と2-3が順番逆だった)
  - インストールライブラリの修正
    - numpy, tqdm
    - For RTX30XX の記述を削除(v1220を通常通りインストールすることで対応できるようになった)
  - 「設定ファイルを書き換える」の増補
  - LD_LIBRARY_PATH 環境変数の指定が不要になっていたので削除
- 2022-07-23: 現時点最新版(v1216)に合わせた内容の修正
  - psutil, protobufの追加
  - CUDAのインストールバージョンを11.1に変更
  - 2.MMVC_Trainerのデータを配置する や 4.ファイルを改変する の内容を増補
  - マルチGPU使用時の設定方法の追加

## Git

- [GitHub - isletennos/MMVC_Trainer: AIを使ったリアルタイムボイスチェンジャー(Trainer)](https://github.com/isletennos/MMVC_Trainer)
- [GitHub - isletennos/MMVC_Client: AIを使ったリアルタイムボイスチェンジャー(client)](https://github.com/isletennos/MMVC_Client)

## 動画解説（ニコニコ動画）

- [「【完結】Imずんだもん王への道（MMVC導入講座）【ソフトウェアトーク解説】（全10件）」 ピポッさんのシリーズ - ニコニコ動画](https://www.nicovideo.jp/series/318700)

## 使用したPC環境

```env
Windows11 Pro 21H2
CPU: Ryzen3900X
GPU: GeForce RTX 3070
MEM: 64GB
```

## 環境構築

### 1. WSL2にUbuntu20.04を作成し、最新にする

```powershell
# WSL2にUbuntuをインストール
# Ubuntu環境が既にある場合は削除する。
wsl --list --online
wsl --install -d Ubuntu-20.04

# WSL2上のUbuntuに入る。
# 以下コメントで `On Ubuntu`となっている箇所はこのコマンド実行後実行するもの。
wsl

# On Ubuntu
sudo apt update
sudo apt upgrade -y

# On Windows
# WSL2 Ubuntuを再起動する
wsl -t Ubuntu-20.04
```

- かなり容量を食う(100GB~)ので、Cドライブに余裕がない場合、この時点で以下を実施
  - [WSL2のストレージを移動する - (名称未定)](https://okutom.hatenablog.com/entry/2020/12/28/172725)
- 以降の作業、[VSCodeにWSL2拡張を入れ、接続する](https://zenn.dev/s_ryuuki/articles/4b9631674adea4)とファイル編集等が楽になります。おすすめです。

### 2. MMVC_Trainerのデータを配置する

詳細は[対象リポジトリ](https://github.com/isletennos/MMVC_Trainer)を参照

#### 2-1. MMVC_Trainerの配置

```bash
# On Ubuntu
cd ~
git clone https://github.com/isletennos/MMVC_Trainer
```

#### 2-2. 録音データの配置

1. 録音データを作成しておく
    - [冒頭で紹介した動画シリーズ](https://www.nicovideo.jp/series/318700)で録音データの収録方法等が詳細に説明されています。
    - 一番時間のかかる作業です。気長にやりましょう。
    - ローカルの適当な場所に保存。
1. Windowsのエクスプローラから`\\wsl$\Ubuntu-20.04\home\<UBUNTU_USERNAME>\MMVC_Trainer\dataset\textful`に録音データ、コーパスデータを配置
    - `<UBUNTU_USERNAME>`は1.でインストールした時に入力するユーザー名
    - 配置する方法は[gitのReadme](https://github.com/isletennos/MMVC_Trainer)や[冒頭で紹介した動画シリーズ](https://www.nicovideo.jp/series/318700)を確認してください。

- 参考：[エクスプローラでWSL2（ubuntu）のディレクトリを開く方法](https://snowsystem.net/other/windows/wsl2-ubuntu-explorer/)

#### 2-3. fine_modelの配置

1. [GitHub - isletennos/MMVC_Trainer](https://github.com/isletennos/MMVC_Trainer) にアクセス
1. 「Ph2. モデルの学習方法 >  1.下記リンクより、「G_180000.pth」「D_180000.pth」をダウンロード」を確認しダウンロード
    - この時、表示されているバージョンが `MMVC_Trainer/version.txt`の内容と合致していることを確認。バージョンが違うと原則動作しません。
1. Windowsのエクスプローラから`\\wsl$\Ubuntu-20.04\home\<UBUNTU_USERNAME>\MMVC_Trainer\fine_model`にアクセスし、ダウンロードしたデータを入れる。
    - `<UBUNTU_USERNAME>`は1.でインストールした時に入力するユーザー名

### 3. 環境構築

```bash
# On Ubuntu
cd ~/MMVC_Trainer

# 使用ライブラリをインストールするために必要なソフトのインストール
sudo apt install python3-pip -y
sudo apt install cmake -y
sudo apt install nvidia-utils-510 -y

# 使用ライブラリのインストール (MMVC_Trainer v1.2.2.0の場合)
pip install pyopenjtalk
sudo apt install espeak -y
pip install Cython==0.29.21
pip install librosa==0.8.0
pip install matplotlib==3.3.1
pip install phonemizer==2.2.1
pip install scipy==1.5.2
pip install tensorboard==2.3.0
pip install torch==1.8.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install torchvision==0.9.0
pip install torchaudio==0.8.0
pip install Unidecode==1.1.1
pip install retry
pip install tqdm
pip install resampy==0.2.2

# WSL2で動作させるためにnotebookに記載された使用ライブラリとは別にインストールしたものやバージョンを指定したもの
pip install psutil
pip install protobuf==3.19.0
pip install numpy==1.22

# pythonのパスを通す
sudo apt install python-is-python3

# monotonic_alignのインストール
cd monotonic_align
python setup.py build_ext --inplace
cd ..

# CUDAのインストール
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda-repo-wsl-ubuntu-11-1-local_11.1.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-1-local_11.1.1-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-1-local/7fa2af80.pub 
sudo apt update
sudo apt install cuda -y

# GPU確認
# GPUが認識されていることやメモリ量等を確認する
nvidia-smi
```

```powershell
# On Windows
# WSL2 Ubuntuを再起動する
wsl -t Ubuntu-20.04
```

- Thanks!：Discord MMVCコミュニティ IsleTennos氏(作者様！)
- Thanks!：@stealthinu@github (Cuda 11.1のインストール)
- Thanks!：@kazumori (psutilのインストール)

### 4. 設定ファイルを書き換える

- `MMVC_Trainer/configs/baseconfig.json`を環境に合わせて書き換える。
  - `"train":`
    - `"eval_interval": 2000` 記録間隔。小さいとこまめに記録されるが容量を食う。
    - `"batch_size": 10`
      GPUのメモリサイズに合わせて調整。大きい方が学習の進み方が速い。  
      そのままで回してみて学習中にメモリエラーが出るようであれば小さくしていく。
      このファイルは設定ファイルのテンプレートなので、後々作成する`train_config_XXX.json`の値も修正する。
  - `"others:`
    - `"os_type": "linux"`
      **WSL2で実行する場合はこの箇所を`"windows"`に変更する!**
- 設定の書換のノウハウは[冒頭で紹介した動画シリーズ](https://www.nicovideo.jp/series/318700)が詳しいです。

<details><summary>旧バージョンではソースコードの書換が必要だったが、現在は設定ファイルの書換だけで対応可能。</summary><div>

- `MMVC_Trainer/train_ms.py`を次の通り書き換える。
  - 14行目、`DistributedDataParallel` を `DataParallel` に。
  - 78行目、`backend='nccl'` を `backend='gloo'`に。
- Windows側から`\\wsl$\Ubuntu-20.04\home\<UBUNTU_USERNAME>\MMVC_Trainer\train_ms.py`をメモ帳等で開いて修正してもよし、Ubuntu側から`vi train_ms.py`で書き換えてもよい。
- [WindowsのVSCodeでWSL2に接続した方が楽](https://zenn.dev/s_ryuuki/articles/4b9631674adea4)。筆者はそうしています。説明は省略。

  ```diff
  diff --git a/train_ms.py b/train_ms.py
  index b20d45f..d19e52f 100644
  --- a/train_ms.py
  +++ b/train_ms.py
  @@ -11,7 +11,7 @@ from torch.utils.data import DataLoader
  from torch.utils.tensorboard import SummaryWriter
  import torch.multiprocessing as mp
  import torch.distributed as dist
  -from torch.nn.parallel import DistributedDataParallel as DDP
  +from torch.nn.parallel import DataParallel as DDP
  from torch.cuda.amp import autocast, GradScaler
  import datetime
  import pytz
  @@ -75,7 +75,7 @@ def run(rank, n_gpus, hps):
  if cpu_count > 8:
      cpu_count = 8

  -  dist.init_process_group(backend='nccl', init_method='env://', world_size=n_gpus, rank=rank)
  +  dist.init_process_group(backend='gloo', init_method='env://', world_size=n_gpus, rank=rank)
  torch.manual_seed(hps.train.seed)
  torch.cuda.set_device(rank)
  train_dataset = TextAudioSpeakerLoader(hps.data.training_files, hps.data)
  ```

- Thanks!：Discord MMVCコミュニティ machibito2氏
- [v1.2.2.0](https://github.com/isletennos/MMVC_Trainer/tree/v1.2.2.0-prefinal) ではこの作業はなくなり、configに `"others":{ "os_type": "windows" }` を追加するだけになる。

</div></details>

### 5. 学習させる

以下の説明はずんだもんになる場合です。
九州そら、四国めたん、春日部つむぎ等、他の話者になりたい場合、[対象リポジトリ](https://github.com/isletennos/MMVC_Trainer)や`MMVC_Trainer/notebook/*`のファイルを読んで音声データを配置の上コマンドを変更しましょう。

```bash
# On Ubuntu
cd ~/MMVC_Trainer
# Create_Configfile
python create_dataset_jtalk.py -f train_config_zundamon -s 24000 -t 100
# Train_MMVC
## 初回のみ
python train_ms.py -c configs/train_config_zundamon.json -m 20220811_24000_zundamon -fg fine_model/G_180000.pth -fd fine_model/D_180000.pth
## 途中から再開する場合
cd ~/MMVC_Trainer
python train_ms.py -c configs/train_config_zundamon.json -m 20220811_24000_zundamon
## 学習を中断させたい場合は `ctrl + c`
```

- マルチGPUで動作させている場合、`python train_ms.py ~`の前に以下のexport行を実行する
  - `export CUDA_VISIBLE_DEVICES=0`
    - 数字が0か1かは環境によって違う。学習中にWindows上のタスクマネージャで学習に使用したいGPUの負荷が上がってるかを確認する。
    - WSL2だとDDPが動作しないため、マルチGPUでの計算は現状できない。（特定の一つのGPUのみで計算する以外に方法がない。）

- Thanks!：@stealthinu@github（マルチGPUの取扱）

### 6. Tensorboardで学習状況を確認する

```bash
# On Ubuntu
cd ~/MMVC_Trainer
tensorboard --logdir logs
# URLが表示されるのでそれにアクセスする。
# 終了するときは `ctrl + c`
```

### 7. 学習成果を利用してボイスチェンジを試みる

- `MMVC_Trainer/logs/20220811_24000_zundamon/` に `D_XXXXXX.pth, G_XXXXXX.pth` が保存されているので、ディレクトリごとWindows側にコピーする。
- [クライアントソフト](https://github.com/isletennos/MMVC_Client) をDLし、設定する。（説明省略）

## 今後の課題等

- ずんだもんボイスの機械学習を続けノウハウを蓄積する。
  - 電気代が悍ましいことになったので涼しい季節になってからにします・・・
- ~~結月ゆかりのトレーニングボイス録音、学習。~~
  - [Seiren Voice　結月ゆかり](https://seiren-voice.dmv.nico/product/yukari) を買え。これはいいものだ。
  - ゆかりさんを崇めよ。
  - ゲーム実況配信とかTRPGオンセで使えたらいいな。