2018/08/17(金) [n年前の日記]
#1 [blender] blenderで静止画に対してネットワークを使った分散レンダリングを試したり
blenderでネットワークを使った分散レンダリングというと、アニメーションを作る際に1フレームずつ、別のPCでレンダリング、という手があるけれど。静止画レンダリングについてはネットワークレンダリングを使えないよ、というのが一般的な認識で。
しかし、blender + LuxRender なら、静止画でもネットワークレンダリングが可能で…。つまり、自分の部屋に転がってるサブPC群に Linux + blender + LuxRender を入れて、レンダリングに参加させてレンダリング時間を短くすることができていたわけで。
_2. ネットワークレンダリングの設定について - blenderやら、なにやら
_操・活・解 Reality その6:ネットワークレンダリングとLinux
_LuxRenderでネットワークレンダリング - Poser大好きMNE
ところが。LuxRender の現行版、 _LuxCoreRender は、Linux版が Intel CPU上でしか動かない気配があって。自分の部屋に転がってるPCの大半は AMD CPU、かつ、Linux を入れてあるので、LuxCoreRender が動かせないという。 *1
複数のPCを使った、静止画のネットワークレンダリング・分散レンダリングが手軽に試せなくなったのは痛いなあ、他のレンダラーでネットワークレンダリングができないものかしら、と悩んでいたのだけど。ググってたら、以下の記事に遭遇。
_簡単な自前ネットワークレンダリング - CGrad Project
Pythonスクリプトで、静止画を100分割して、それぞれを別PCでレンダリングしたら、最後に ImageMagick で1枚に結合、という仕組みらしい。
この方法なら、blender が標準で持ってる旧レンダラー、あるいは Cycles レンダラーを使っても、静止画のネットワークレンダリングができそうだなと…。てなわけで試してみたり。
しかし、blender + LuxRender なら、静止画でもネットワークレンダリングが可能で…。つまり、自分の部屋に転がってるサブPC群に Linux + blender + LuxRender を入れて、レンダリングに参加させてレンダリング時間を短くすることができていたわけで。
_2. ネットワークレンダリングの設定について - blenderやら、なにやら
_操・活・解 Reality その6:ネットワークレンダリングとLinux
_LuxRenderでネットワークレンダリング - Poser大好きMNE
ところが。LuxRender の現行版、 _LuxCoreRender は、Linux版が Intel CPU上でしか動かない気配があって。自分の部屋に転がってるPCの大半は AMD CPU、かつ、Linux を入れてあるので、LuxCoreRender が動かせないという。 *1
複数のPCを使った、静止画のネットワークレンダリング・分散レンダリングが手軽に試せなくなったのは痛いなあ、他のレンダラーでネットワークレンダリングができないものかしら、と悩んでいたのだけど。ググってたら、以下の記事に遭遇。
_簡単な自前ネットワークレンダリング - CGrad Project
Pythonスクリプトで、静止画を100分割して、それぞれを別PCでレンダリングしたら、最後に ImageMagick で1枚に結合、という仕組みらしい。
この方法なら、blender が標準で持ってる旧レンダラー、あるいは Cycles レンダラーを使っても、静止画のネットワークレンダリングができそうだなと…。てなわけで試してみたり。
◎ 実験に使ったシーンデータ。 :
以下のページで、blenderのレンダリング実験に使えそうなデータが公開されてる。
_Demo Files - blender.org
今回は、BMW Benchmark (BMW27_2.blend.zip) を使ってみた。これは Cycles レンダラーを使うシーンデータで、CPUで計算するように設定されたシーンデータと、GPUで計算するように設定されたシーンデータ ―― 2つのシーンデータが入ってる。
_Demo Files - blender.org
今回は、BMW Benchmark (BMW27_2.blend.zip) を使ってみた。これは Cycles レンダラーを使うシーンデータで、CPUで計算するように設定されたシーンデータと、GPUで計算するように設定されたシーンデータ ―― 2つのシーンデータが入ってる。
◎ 実験に使ったPC。 :
以下のPCを利用して実験。
メインPC + GPU。Windows機。
サブPC1。Linux機。
サブPC2。Linux機。
メインPC + GPU。Windows機。
- CPU : Intel Core i5-2500 (4 core / 3.3GHz / TDP 95W)
- GPU : GeForce GTX 750 Ti
- RAM : 8GB
- OS : Windows10 x64
- blender 2.79b
サブPC1。Linux機。
- CPU : AMD Athlon II X2 250 (2 core / 3GHz / TDP 65W)
- RAM : 8GB
- OS : Ubuntu Linux 16.04 LTS 64bit
- blender 2.79b
サブPC2。Linux機。
- CPU : AMD A6-3500 (3 core / 2.1GHz / TDP 65W)
- RAM : 8GB
- OS : Linux Mint 18.3 64bit
- blender 2.79b
◎ 結果。 :
まず、メインPCで、GPU GeForce GTX 750 Ti を使ってレンダリングしてみた。9分46秒 (586 sec)。約10分でレンダリングできた。
これを、サブPC1、Athlon II X2 250 + Linux で、CPUを使って計算、かつ、前述のページから入手したPythonスクリプトを使って、画像を100分割しながらレンダリングしてみた。1時間25分57秒 (5157秒)。つまり、PC1台で、CPUを使って計算すると、約1時間半かかる。
Linux機を2台使って、ネットワークレンダリングしてみた。43分42秒 (2622秒)。
1台では1時間半かかってたのが、2台使ったら45分になったので…。ネットワークレンダリングをすることで、1台でレンダリングするよりレンダリング時間はたしかに短くなった。しかし、期待していたほど速くはなってない…。
処理中のログが画面にずらずらと出てくるけれど、眺めていると、どうも事前の計算で時間がかかってるようにも見える。ならば、分割数を 10x10 = 100 ではなく、8x8 = 64 ぐらいにしたら、事前の計算を減らせて速くなったりしないか…。ちなみに、Pythonスクリプト内の数値を3箇所ほど弄れば、分割数は変えられる。
Linux機を2台使って、8x8 = 64分割してネットワークレンダリングしてみた。39分20秒 (2360秒)。約45分が、約40分に。ビミョーに速くなってはいるけど、それほどでもないな…。
Linux機 x 2台 + メインPC Windows機 1台、合計3台でレンダリングしてみた。かつ、分割数も 6x6 = 36分割に。計算は全てCPU。18分18秒 (1098秒)。約40分が、約20分に。
最初に1台で計算させたときは1時間半かかってたけど、3台使ったら、20分まで短縮できた。
しかし…。メインPCのGPUで計算させた場合は10分でレンダリングできるわけで…。3台のPC ―― CPUコア数で言えば、4 + 2 + 3 = 9コアを使って計算させて、20分。GPUだけで計算させたら、10分。
これを、サブPC1、Athlon II X2 250 + Linux で、CPUを使って計算、かつ、前述のページから入手したPythonスクリプトを使って、画像を100分割しながらレンダリングしてみた。1時間25分57秒 (5157秒)。つまり、PC1台で、CPUを使って計算すると、約1時間半かかる。
Linux機を2台使って、ネットワークレンダリングしてみた。43分42秒 (2622秒)。
1台では1時間半かかってたのが、2台使ったら45分になったので…。ネットワークレンダリングをすることで、1台でレンダリングするよりレンダリング時間はたしかに短くなった。しかし、期待していたほど速くはなってない…。
処理中のログが画面にずらずらと出てくるけれど、眺めていると、どうも事前の計算で時間がかかってるようにも見える。ならば、分割数を 10x10 = 100 ではなく、8x8 = 64 ぐらいにしたら、事前の計算を減らせて速くなったりしないか…。ちなみに、Pythonスクリプト内の数値を3箇所ほど弄れば、分割数は変えられる。
Linux機を2台使って、8x8 = 64分割してネットワークレンダリングしてみた。39分20秒 (2360秒)。約45分が、約40分に。ビミョーに速くなってはいるけど、それほどでもないな…。
Linux機 x 2台 + メインPC Windows機 1台、合計3台でレンダリングしてみた。かつ、分割数も 6x6 = 36分割に。計算は全てCPU。18分18秒 (1098秒)。約40分が、約20分に。
最初に1台で計算させたときは1時間半かかってたけど、3台使ったら、20分まで短縮できた。
しかし…。メインPCのGPUで計算させた場合は10分でレンダリングできるわけで…。3台のPC ―― CPUコア数で言えば、4 + 2 + 3 = 9コアを使って計算させて、20分。GPUだけで計算させたら、10分。
CPU | divide | time | time(sec) |
---|---|---|---|
GPU GeForce GTX 750 Ti | 1 | 00:09:46 | 586 |
Athlon II X2 250 | 100 | 01:25:57 | 5157 |
Athlon II X2 250 + A6-3500 | 100 | 00:43:42 | 2622 |
Athlon II X2 250 + A6-3500 | 64 | 00:39:20 | 2360 |
Athlon II X2 250 + A6-3500 + Core i5-2500 | 36 | 00:18:18 | 1098 |
◎ 結論。 :
複数のPCを使ってCPUでレンダリングするよりも、速いGPUを買ってGPUでレンダリングしよう。そのほうが速い。
ただ、GPUを使って計算するレンダラーが使えない場合なら、複数のPCを使って分散レンダリングすることで、レンダリング時間を短縮できる可能性はありそうだなと。
ただ、GPUを使って計算するレンダラーが使えない場合なら、複数のPCを使って分散レンダリングすることで、レンダリング時間を短縮できる可能性はありそうだなと。
*1: OS が Windows であれば、AMD CPU であっても、LuxCoreRender は動作するらしい。Linux上で動かそうとすると、利用できるCPUの種類に制限が出てくる模様。Linux版が利用してるライブラリが、Intel CPUに特化した設定でビルドされているので、そのあたりを無効にしてビルドできるなら AMD CPU + Linux上でも動く可能性はありそう。
[ ツッコむ ]
以上、1 日分です。