SberSwap(ai-forever/ghost)をWSL2-Ubuntuで動かしてみた

[ai-forever/ghost](https://github.com/ai-forever/ghost)をWSL2のUbuntuで動かした際の備忘録です。
[GoogleColabでの例](http://cedro3.com/ai/sberswap/)は見つかるのですが、ローカル環境で動作させたものはなく苦戦しました。
色々試したのですが、最終的にはアップロードされているGoogleColabの環境をローカル環境で再現することで動作しました。
この記事が誰かのお役に立てればと思います。

# 実行環境
- Windows 10 Pro 
- WSL2 Ubuntu 20.04 LTS
- Python 3.10.12
- NVIDIA GeForce RTX 3070 (GPU Memory: 8.0GB)

# CUDA 周りのインストール

下記をインストールします。

- CUDA Toolkit 11.8 
- cuDNN v8.9.2 for CUDA 11.x 
- NCCL 2.12.5, for CUDA 11.8


## CUDA Toolkit 11.8 

[CUDA Toolkit 11.8 Downloads](https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local) を参考にして以下のコマンドを実行

```bash
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.8.0/local_installers/cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
```

## cuDNN v8.9.2 for CUDA 11.x 

[cuDNN Installation Guide](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html) を参考にインストールを行います。今回は [Tarファイルを利用した方法](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-tar)を使用しました。

1. [cuDNN Download](https://developer.nvidia.com/rdp/cudnn-download) の Local Installer for Linux x86_64 (Tar) よりダウンロード、ワーキングディレクトリに配置
2. 下記を実行
    
    ```bash
    tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
    sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include 
    sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 
    sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
    ```

## NCCL 2.12.5, for CUDA 11.8

NCCL は後でインストールする mx-net が必要とするモジュールです。[NCCL installation Guide](https://docs.nvidia.com/deeplearning/nccl/install-guide/index.html) の Ubuntu 部分を参考にインストールを行います。

1. [NCCL Legacy Download Page](https://developer.nvidia.com/nccl/nccl-legacy-downloads) の Local installer for Ubuntu 20.04 よりダウンロード、ワーキングディレクトリに配置
2. 下記を実行

```bash
sudo dpkg -i nccl-repo-<version>.deb
<指示に従ってローカルキーをインストール
sudo apt update
sudo apt install libnccl2 libnccl-dev
```

# Python モジュールのインストール
下記をインストール

```bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install mxnet-cu112
pip install onnxruntime-gpu==1.12
pip install Cython
pip install insightface==0.2.1
pip install kornia==0.5.4
pip install dill
```

# ffmpeg インストール

動画のディープフェイク作成時に ffmpeg を使用するのでインストール

```bash
sudo apt install ffmpeg
```

# エラー対応
実行環境は整ったのですが、私の環境ではいくつかエラーが発生したのでその対応を記載します。強引な修正ではありますが動作します。

## AttributeError: module 'numpy' has no attribute 'bool'. Did you mean: 'bool_'?

mxnet/numpy/utils.py の「bool_」の記述は残しつつ「bool」に関する記述をすべて削除

こんな感じ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/a2f037fe-1203-b615-02f8-d1fee4352d14.png)


## This ORT build has ['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'] enabled. Since ORT 1.9 ...

onnxruntime/capi/onnxruntime_inference_collection.py の _create_inference_session 関数に下記を追加

```python
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']
```

こんな感じ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/47db5825-abc7-7094-5a16-8f69eb7958a6.png)

# 動作確認
`python3 inference.py`を実行して動作確認します。
各引数にはデフォルト値が適用され、ghost/examples/results に result.mp4 が生成されます。
Warning が大量発生しますがご容赦ください。

```bash
~/ghost$ python3 inference.py
/home/****/.pyenv/versions/ghost/lib/python3.10/site-packages/kornia/augmentation/augmentation.py:1830: DeprecationWarning: GaussianBlur is no longer maintained and will be removed from the future versions. Please use RandomGaussianBlur instead.
︙
  if spsp is not None and isinstance(source_array, spsp.csr.csr_matrix):
/home/****/.pyenv/versions/ghost/lib/python3.10/site-packages/mxnet/ndarray/utils.py:141: DeprecationWarning: Please use `csr_matrix` from the `scipy.sparse` namespace, the `scipy.sparse.csr` namespace is deprecated.
  if spsp is not None and isinstance(source_array, spsp.csr.csr_matrix):
100%|█████████████████████████████████████████████████████████████████████████████████| 289/289 [00:07<00:00, 39.55it/s]Video saved with path examples/results/result.mp4
Total time:  14.406058311462402
```

私の環境では14秒ほどで終了しました。

# 参考文献

- [SberSwapで、個別の学習プロセス無しでFaceSwapを実現する](http://cedro3.com/ai/sberswap/)
- [超簡単に2枚の画像の顔交換ができる！SberSwapを使ってみよう](https://blog.motimotilab.com/sberswap/)
- [【Pythonでディープフェイク動画作成】SimSwapのインストール](https://self-development.info/%E3%80%90python%E3%81%A7%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%95%E3%82%A7%E3%82%A4%E3%82%AF%E5%8B%95%E7%94%BB%E4%BD%9C%E6%88%90%E3%80%91simswap%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88/)