BlenderでRTX 2080 Tiの4倍速いレンダリングを体験してみる


# はじめに
今回は割とちゃんとした記事を書こうと思い、普段から使っているクラウドでレンダリングする方法を説明していきます。Blenderを使っている人の多くは、モデリング用かもしれませんが、この記事がきっかけで、モデリング以外の動画作成などにも興味を持ってもらえたら嬉しいです。

ちなみに、昨日全てBlenderでモデリングして作った180°のVRの動画をuploadしたのでぜひ見ていただけたらと思っています。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/l8JJA3FBb9U/0.jpg)](http://www.youtube.com/watch?v=l8JJA3FBb9U)

今日は、コンシューマー向けのGPUで今あるものの中で一番良いのではないかと思っている、NvidiaのRTX2080 Tiよりもさらに高速でレンダリングする方法を書きます。日本語も英語の記事もほとんどないので、参考になると思います。


## クラウドレンダリングとレンダーファームの違い

クラウドレンダリング とレンダーファームの違いは、インスタンスやOSの管理が異なることがあげられます。

レンダーファームの場合は、OSなどがインストール済のPCをいくつか連結したPC群に対してファイルをuploadして、そのファイルをレンダリングしてもらいます。一方で、クラウドレンダリングの場合は、OSのインストールから、レンダリングを行うソフトまで全てを自分でインストールしてから出ないと利用できません。しかし、その分カスタマイズが色々とできるのが特徴です。例えば、レンダリングの方法を変更したり、自分好みにOSをかけたり、GPUのスペックや立ち上げるインスタンスの数も自由に変更ができます。

この自由度によって、レンダーファームでは出せなかったスピードのレンダリング時の様々なカスタマイズが可能になってきます。

## 環境
今回は、以下の環境を構築してレンダリングを行っていきます。
- クラウドはAWS(もちろん、他のクラウドでも同じことができます。)
- Ubuntu 18.04.3 LTS
- Blender2.81


# 実装

ここでは、実際にインスタンスを起動して、Blenderでレンダリングする方法を説明していきます。
## インスタンスの実行

僕が普段使っているGPUは、[Nvidia Tesla T4](https://www.nvidia.com/en-us/data-center/tesla-t4/)です。このGPUには、AWSが提供しているGPUのうち唯一RTコアが乗っています。RTコアは、リアルタイムトレーシング向けのコアで、BlenderでOptiXによる高速レンダリングを行う時に、必要になります。他にもTesla M60などは、グラフィックスに向いているとAWSのサイトの方に書いてありました。
https://aws.amazon.com/jp/ec2/instance-types/g3/

Tesla T4は、AWS上では、g4dnという名前のインスタンスなので注意してください。
今回は、GPUインスタンスのOSに、Ubuntu 18.04.3 LTSを利用しています。

## インスタンスの環境構築

必要なインスタンスをAWSのコンソールから起動まで終われば、あとは、ターミナルなどでの操作になります。以下のコマンドをコピーして必要な環境をインストールしていきます。

### 初期設定
  
まずは、起動したインスタンスにssh接続します。

```
ssh -i "{your_key_name}.pem" ubuntu@{your_instance_ip}.compute-1.amazonaws.com
```
{your_key_name}には、インスタンス起動時に設定した鍵の名前、{your_instance_ip}には、起動したインスタンスのipが入ります。権限関連で、接続を拒否される場合は、sudoでもう一度試してみてください。インスタンスに接続できたら、GPUを利用する初期設定をしていきます。

```
#rootユーザー切り替え
sudo su -
    
# TIMEZONEをJSTに
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

#CUDAをインストール
curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
dpkg -i ./cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
apt update && apt install -y cuda

# GPUを有効化
nvidia-smi -pm 1
nvidia-smi --auto-boost-default=DISABLED

#GPUの動作確認
nvidia-smi
```

ここまでで、起動しているインスタンスのGPUが利用可能な状態になっていれば、次のような表示が出ます。

```

| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   34C    P8    28W / 149W |     11MiB / 11441MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

```

## Blenderのインストール

今回利用しているOSは、Ubuntuなので、Snap StoreからBlenderをインストールしてきます。

```
sudo snap install blender --classic
#インストールはデフォルトでは、以下のpathに行われます
cd /snap/bin 
```

ここまでで、blenderでレンダリングができる環境が整いました。思っていた以上に簡単でした!!

# Blenderでクラウドレンダリング

最後に、環境構築ができたGPUインスタンス上でレンダリングを行っていきます。

##レンダリングを行うファイルのupload

初めにレンダリングを行いたいシーンを含むBlendファイルをAWSにuploadしていきます。
そのままインスタンスにuploadしてもいいですが、コストと毎回uploadするめんどくささを考えると、一旦S3にuploadしておくことをお勧めします。直接インスタンスにuploadする場合は、以下のコマンドをターミナルから叩けばできます。

```
sudo scp -i /{path1}/.ssh/{your_key_name}.pem /{path2}/{your_blend_file_name}.blend ubuntu@{your_instance_ip}.compute.amazonaws.com:~
```
{path1}には、AWSのインスタンスにアクセスする鍵を保存しているパスが入ります。{path2}には、uploadしたいファイルのパスが入ります。{your_blend_file_name}には、レンダリングを行いたいblendファイルの名前が入ります。

これでレンダリングをしたいファイルをuploadできたら、最後にレンダリングを行います。

レンダリングを行うときのoptionの設定方法は、以下のページから確認できます。
https://docs.blender.org/manual/en/latest/advanced/command_line/arguments.html

通常のレンダリングの場合は、以下のコマンドを叩くことで開始します。

```
blender -b {your_blend_file_name}.blend -o ./output/f__ -s {start_frame} -e {end_frame} -a

```

{start_frame}には、レンダリングを始めるフレーム数、{end_frame}にはレンダリングを止めるフレーム数を入力します。これで、outputディレクトリーにレンダリングが終わったファイルが生成され始めます。

#ベンチマーク

最後にクラウドレンダリングをした時に、RTX2080 Tiと比較してどの程度速度が向上するかについて述べていきます。答えは、RTX2080 Tiを一台積んだPCに比べて無限に速度アップは理論上可能です。
というのも、クラウド上には、たくさんのGPUインスタンスが世界に用意されていて、それらを全て同時に利用すればレンダリング自体は、瞬時に終わります。しかも、クラウドレンダリングの場合、利用直に対しての課金であるので、複数台でレンダリングを一瞬で終わらせたとしても、一台でノロノロ終わらせたとしても、レンダリング自体にかかる総時間が変わらない場合、かかる費用は同じなのです。
(ex, 100台で1時間レンダリングをするのと、1台で100時間レンダリングするのにかかる費用は同じです。)

しかし、現実的には、AWSの用意しているGPU自体の数は有限ですし、他の人がGPUを使っているので同時にたくさんのGPUを利用することは難しいかもしれません。

ここでは、わかりやすいようにAWSの提供しているg4dn.12xlargeと呼ばれるインスタンス一台をRTX2080Ti一台と比較して話します。この場合は、RTX2080Tiで12分かかったレンダリングは、g4dn.12xlargeでは、3分程度で終わりました。サンプル数は少ないですが、概ね1/4程度でレンダリングが終わる印象です。

#最後に

以上がクラウドレンダリングの外観でした。まだまだ色々なカスタマイズ方法や、コスト削減方法、レンダリングのオプション等ありますが、また今後紹介していきます。twitter(@r_etx)の方でも質問を受け付けているので、何かあれば来てください!!