Houdini 19.5 ダイナミクス

流体シミュレーションの分散

Distributeシェルフツールは、HQueueを使用して複数マシンのファーム上で並列処理ができるように、オブジェクトのシミュレーションネットワークをセットアップします。

On this page

概要

Houdiniは、HQueueを使用して複数マシンで並列処理できるように、オブジェクトのシミュレーションネットワークをセットアップすることができます。 HQueueは、レンダリングとシミュレーションのジョブ管理システムであり、HQueueサーバー、HQueueクライアント、ワークステーション、共有フォルダで構成されています。

  • HQueueサーバーは、異なるクライアントマシンにタスクを分散させる役割を担っています。また、HQueueサーバーにはWebインターフェースが備わっており、そこでジョブの監視と管理を行なうことができます。通常では、HQueueサーバーは1台のコンピュータにインストールします。

  • HQueueクライアントは、HQueueサーバーからジョブを受け取り、入力のシミュレーションとレンダリングのタスクを実行します。クライアントのことを ノード と呼ぶ場合もあります。HQueueサーバーを起動するマシンをHQueueクライアントとして構成しても構いません。このHQueueクライアントは、ジョブを走らせたいすべてのコンピュータ上にインストールする必要があります。

  • Houdiniで作業しているユーザは、自身のワークステーションからHQueueサーバーにジョブを投入すると、そのジョブがHQueueクライアントに分散されます。

  • 共有フォルダは、ネットワーク上の共有ドライブとしてマウントされている必要があります。ワークステーションは、入力ファイルがHQueueクライアントからアクセスできるようにその共有フォルダに転送します。その一方で、HQueueクライアントは、出力ファイルをその共有フォルダに書き出します。そしてワークステーションは、その出力ファイルを読み込むことができます。

始める前に

シミュレーションジョブの分散を始める前に、まずHQueueサーバーとHQueueクライアントがインストールされていなければなりません。 これらをインストールするには、SideFXのウェブサイトからHoudiniインストーラをダウンロードして、それを実行します。 通常では、ソフトウェアのインストールには管理者権限が必要です。どのコンピュータを以下のどの用途にすべきか決めます。

  • HQueueサーバー。HQueueサーバーは 1台 のマシンにのみインストールしてください。

  • HQueueクライアント。HQueueクライアントは、ジョブを走らせたい すべて のマシンにインストールしてください。

  • 共有フォルダ。この共有フォルダはHQueueサーバーのWebインターフェースから定義します。すべてのマシンがこのフォルダにアクセスするのに適切な権限がなければなりません。

Note

インストール、OS固有の設定、IPアドレスなどのトピックの詳細は、HQueueドキュメントを参照してください。 このガイドは、独自のファームをセットアップする工程全体について説明しています。

必読

Houdiniのシミュレーションネットワークのほとんど(例えば、Vellum、流体、リジッドボディダイナミクスなど)は、SOP内で作成することもできます。 しかし、現在のところ、分散シミュレーションはDOPベースのワークフローでのみ可能です。 もっと正確に言うと、SOPベースのシミュレーションジョブは1台のHQueueクライアントに送信することはできるのですが、そのジョブを複数のマシンに分散させることができません。

DOPベースのネットワークに関しては、さらに1つ重要な制限事項があります

  • HoudiniのPyro FXシェルフツールPyro Solver (Sparse)ベースであり、デフォルトでは分散シミュレーションに対応していません。シミュレーションを分散させたいのであれば、手動でそのPyro Solver (Sparse)を標準DenseボリュームベースのPyro Solver DOPに置換する必要があります。

POPパーティクル、非適応パーティクル流体、DenseボリュームベースのPyroシミュレーションを スライス によって分散させることができます。 これによって、エフェクトが起きる空間がスライスに区分けされて、各 スライス が別々のマシンで計算されます。 グリッドベースの流体コンテナは、面単位で特定の数だけ分割してスライスすることができますが、パーティクル流体シミュレーションに関しては 境界がない ので、手動でスライスしなければなりません。 スライスしたシミュレーションにおいては、ネットワークのノードはスライス間の境界を越えてお互い情報を交換し合います。

その一方で、標準DenseボリュームベースのPyroシミュレーションもCluster SOPを介してPyroソースパーティクルを区分けしてクラスタ化することができます。 各クラスタコンテナはそれぞれ独立して計算します。それは他のクラスタコンテナと重複してる場合も同じです。 煙とPyroのシミュレーションにおいては、その出力ボリュームは視覚的には一緒に混ざるので上手く動作します。

分散のセットアップ

パーティクル流体は、長いシミュレーション時間を要することが多いので、分散シミュレーションでは最も関心のあるソルバタイプであることは確かです。 分散シミュレーション用のプロジェクトを準備する作業を容易にするために、様々なシェルフツールを使用することができます。 それらのシェルフツールは、Particle Fluidsシェルフツール内にすべて配置されています。

  1. Particle Fluids シェルフタブを開きます。

  2. FLIP Tankシェルフツールを⌃ Ctrlクリックして、タンクをシーンの原点に配置します。

  3. 同じシェルフタブにある Distribute Particle Fluidシェルフツールをクリックします。

  4. このツールを実行するには、必ずパーティクル流体を選択してください。ビューポートの左側にあるアイコンバーから、 Select ツールを選択し、ビューポート内でパーティクル流体を矩形ドラッグします。そして、Enterを押して選択を確定します。

  5. Houdiniがネットワークエディタの out コンテキストにジャンプします。そこにdistributedsim_fliptankノードが出来ているのが確認できます。このノードは、ジョブをHQueueに投入してファーム上でそのジョブを分散させます。

  6. distributedsim_fliptankノードの Output Driver パラメータでパスを確認することができます。上記の手順に従った場合、そのパスは/obj/distribute_fliptank/saveになっていて、このsaveがHQueueクライアントで実行されるノードです。

  7. ネットワークエディタ内でこのパスを開きます。そのsaveノードはGeometry Output ROPで、 Save to Disk をクリックすることでシミュレーションが実行されます。

シミュレーションを分散させるメソッド

distributedsim_fliptank HQueue Simulationレンダーノードのパラメータに配置されている Partitioning Type ドロップダウンメニューから使用したい分散メソッドを選択することができます。

No Partitioning

シミュレーション全体を他のマシンに送信して、全体としてそれをシミュレーションします。

Clustering

ソースをX,Y,Z軸でぶつ切りにして区分けすることができます。 これらのピースは同時にシミュレーションされますが、お互いに通信することもフレーム間でパーティクルを転送することも できません 。 このメソッドでは、各パーティションは次のフレームに進む前に現在のフレームのシミュレーションが完了するのを待つ必要がないので、Slicingメソッドよりも非常に高速です。

Slicing

パーティクル流体を含んだ空間をスライスすることができるので、HQueueファーム上の異なるマシンで、その流体の別々の部分をシミュレーションさせることができます。 このメソッドは各フレームの最後にスライス間でパーティクルを転送するので、Clusteringよりも精度が良いです(が、処理も重くなります)。

Tip

ピースの方向と階層に関するコントロールがもっと必要であれば、 Sliceまたは Slice Along Lineのシェルフツールを使用してください。

詳細は、以下のスライスした分散シミュレーションのセットアップを参照してください。

Volume Slicing

パーティクル流体を含んだ空間をNxMxPの3D配列で同一サイズのピースに自動的に分割します。 特定の重なりを指定して各ピース周辺にバッファを用意することもできます。 そして、別々のマシンが各スライスで動作し、定期的にそららのバッファを同期させます。 これは、Pyro計算のように固定された矩形空間での Dense シミュレーションで上手く動作します。

Particle Slicing

非Dense シミュレーションに関しては、ドメインを同一サイズのパーツに分割するのは意味がありません。 あるマシンが他のマシンの終了を待たないようにパーティションのバランスを取るのが重要です。 そのため、代わりに Slice ノードまたは Slice Plane DOP ノードを使用してシミュレーション空間を分割する必要があります。 これらのノードは、ワールドを各シミュレーションマシンが 所有 する別々の領域に分割します。 各マシンは、それ自身のスライス用のすべてのデータと、常時更新する必要がないように周辺スライスの境界情報を持ちます。

Wedging

シミュレーションの様々なバリエーションを試すことができます。 詳細は、 HQueue Simulationレンダーノード Wedgeレンダーノードを参照してください。

スライスした分散シミュレーションのセットアップ

パーティクル流体を含んだ空間をスライスすると、HQueueファーム上の別のマシンに流体の別の 領域 をシミュレーションさせることができます。 スライスしないでパーティクル流体シミュレーションをファームに送ることもできますが、複数マシンの並列処理ではなく、1台のマシンで単にシミュレーションしているだけにすぎません。

Particle Fluids タブには、パーティクル流体シミュレーションをスライスして分散できるように別の領域に分けるツールが2つあります:

  • Slice Along Lineツール

    特定の方向に沿って特定の数だけ空間を等分することでスライスを作成します。 これがスペースをスライスする一番単純な方法です。

  • Sliceツール

    階層状の平面を交差させて空間をスライスするので、任意に複雑な方法で分割することができます。

各領域にはHQueueクライアントネットワーク上の個々のマシンが必要なので、持っているマシンと同じ数の領域のみをセットアップすることができます。 例えば、 Slice Along Line ツールで Number of Regions8に設定すれば、HQueueネットワークには8台のマシンが必要となります。

流体空間をスライスする方法

  1. Particle FluidsClothWire シェルフタブから Distribute ツールをクリックします。

  2. パーティクル流体、布、ワイヤーオブジェクトを選択してEnterを押します。

    このツールは、シミュレーションを分散するために色々なネットワークにいくつかのノードを作成します:

    • /outdistributedsim HQueue Simulationレンダーノードが作成されます。これはシミュレーションをHQueueに出力します。

      このレンダーノードは分散ジョブをHQueueサーバーに送ります。

    • /objdistribute_オブジェクト名 オブジェクトが作成されます。これはHQueueクライアントで作成されたシミュレーションファイルをHoudiniに戻すオブジェクトです。

    • DOP NetworkにDISTRIBUTE_オブジェクト名_CONTROLS Nullノードが作成されます。

      このノードは主に、値の代用として使います。レンダーノードは、トラッカーアドレス/ポートとスライス分割のようなコントロール Null DOPに値を明確に設定します。そして、ネットワークの複数のdistribution-aware DOPが、そのコントロール Null の値を参照します。

  3. ジオメトリファイルの保存($HIP/geo/dist_${SLICE}_$F.bgeo.gz)に使うデフォルトパスのパターンを変更したい場合は、シーンレベル(/obj)に移動して、distribute_オブジェクト名オブジェクトをダブルクリックして中に入ります。loadslicesFileノードを選択して、 File パラメータを変更します。詳細は、ファイル名にエクスプレッションを使うを参照してください。

    パスは$HIP基準の相対パスにしたほうが良いです。

ファーム上にシミュレーションを実行しないでシミュレーションスライスを閲覧する方法

Distribute ツールは、ネットワークを修正して、分散できるように準備します。それらの修正の後にシミュレーションを再生すると、ネットワークは全体のシミュレーションの内、1スライスのみしか計算しません。そして、いくつかのノードでは、HQueueピアーとの通信を試みるので、ネットワークトラフィックが発生します。

単体のマシンでシミュレーションをチェックしたいのであれば、 Distribute ツールで作成されたコントロール Null DOPのパラメータを使って、一時的にネットワークを分散処理しないように戻すことができます。

To...Do this

シミュレーションを分散しないでスライスを閲覧する

  1. DOP NetworkのDISTRIBUTE_uprespyro_CONTROLS Null ノードの Distribution チェックボックスをオフにします。

  2. Slice パラメータを閲覧したいスライスに設定します。

FLIPによるパーティクル流体の分散の使い方

タンクによるパーティクル分散を使用すると、流体を損失してしまうことがあります。 この問題を回避するには、FLIP SolverDistributed Pressure Solve チェックボックスを有効にします。 これは、タンク内の圧力を考慮し、スライス間の繋目がより滑らかになります。

Narrow Band(狭帯域) FLIPタンクの分散セットアップの方法

  1. Oceans シェルフ上のツールのどれかを使って FLIPタンクを作成します。デフォルトでは、 Narrow Band Particles が有効になっているはずです。

  2. Particle Fluids シェルフ上のSliceツールを使って、パーティクル流体をスライスします。

  3. Distribute シェルフツールを使って、 Slicing を選択します。これは、HQueueを使って複数のマシン上で並列で流体を計算できるネットワークをセットアップします。

Whitewaterシミュレーションの分散セットアップの方法

  1. Oceans シェルフ上のツールを使ってWhitewaterシミュレーションを作成します。

  2. 分散させたいWhitewaterを選択して、 Particle Fluids シェルフの Distribute Particle Fluid ツールをクリックします。

  3. ポップアップダイアログボックスから、 No PartitioningClustering のどちらかの分散メソッドを選択します。

    Note

    SliceツールまたはSlice Along Lineツールを使ってWhitewaterが事前にスライスされていれば、さらに Slicing の選択肢もあります。

    No Partitioning を選択すれば、シミュレーション全体を他のマシンに送信することができます。 Clustering を選択すれば、他のマシンで同時にシミュレーションできるようにシミュレーションをぶつ切りにすることができます。 どちらのオプションでも分散シミュレーション用のHQueue Simulationを作成します。

  4. Clustering を選択すると、HQueue Simulationレンダーノードの Partition TypeClusters に設定されます。 Cluster Node パラメータの Jump to operator ボタンをクリックすると、partition_emissionサブネットワークにジャンプします。

  5. Divisions パラメータを使ってクラスタを設定します。

    Note

    クラスタは個別にシミュレーションされることから、別のクラスタで誕生したパーティクルをフレーム間で転送することができないので、パーティクル流体は、フロー方向に平行で分割してください。

    以下の例では、Beach TankがZ軸に沿って分割されています。これは、海辺に乗り上げる波の流れに合わせています。

クラスタ化したSmoke/Pyroシミュレーションの分散セットアップ

  1. Pyro FX シェルフタブの Smoke ClusterPyro Cluster ツールを使って、ポイントソースからクラスタ化した煙またはPyroシミュレーションを作成します(クラスタ化を参照)。

  2. Container Tools シェルフタブの Distribute ツールをクリックします。

  3. 分散させるコンテナを選択してEnterを押します。

    Smoke/Pyro Clusterツールで作成された複数のコンテナでクラスタ化したシミュレーションを分散しているなら、その複数のコンテナから1つを選択することができます。

    (別の方法として、ネットワークエディタからDOPオブジェクトを選択してビューポートでEnterを押します。)

  4. オブジェクトに複数のコンテナ(例えば、クラスタ化で作成)があれば、ダイアログボックスが表示されて スライス または クラスタ化 をしてシミュレーションを分散したいのか聞いてきます。

    (シミュレーションが大規模で、1個のクラスタコンテナでさえも1台のマシンで実行するには重すぎるのであれば、 Slicing をクリックして各クラスタコンテナに対して別々にスライスを分散します。)

  5. なんらかの理由でシミュレーション結果をインポートするオブジェクトが2つ以上ある場合、ダイアログボックス表示されて、どのオブジェクトを分散で使うのか聞いてきます(以下のツールがどのようにしてジオメトリネットワークを修正するのかを参照)。

  6. ツールはHQueue Simulationレンダーノードを作成して選択します。そのノードの HQueue Server パラメータにHQueueサーバー名とポート名を設定します(例えば、hq.company.com:5000)。

    スライスを使っていれば、 Slice Divisions パラメータを設定することができます。デフォルトの1, 1, 1だと、実際にはコンテナを複数のサブドメインに分割しません。 例えば、これらの値を2, 2, 2まで上げると、そのコンテナが分散できるように8個の小さいボックスにスライスされます。

シーンの裏側で分散クラスタリング

あなたが分散したシミュレーションされるフィールド(例えば、import_pyro_build)をインポートするジオメトリオブジェクトに、 Distribute ツールはDOP I/Oノードを追加することで、ファーム上のROP Output Driverによって生成されるクラスタフィールドをディスクに書き出すことができます。

HIPファイルがファーム上で実行(以下参照)されている時、HQueueレンダーノードは以下の事を行ないます:

  • グローバル$CLUSTER変数を、そのマシンで生成されるクラスタ番号に設定します。

  • Cluster Points ノード(HQueueレンダーノードの Cluster Node パラメータで指定されたノード)で、 Cluster Filter パラメータを$CLUSTER変数に設定します。すると、ソースネットワークはそのクラスタ番号用のソースポイントのみ生成します。

  • ROP Output Driverを処理(HQueueレンダーノードの Output Driver パラメータで指定されたノード)します。それは、シミュレーションが現在のクラスタとフレームのジオメトリを処理して書き出します。

また、 Distribute ツールは、ネットワークにFile Mergeノードを作成することで、ファーム上で生成されたクラスタフィールドをインポートして、それを再統合します。このノードのディスプレイとレンダリングのフラグを設定して、あなたのマシン上のHIPファイルを見るとキャッシュ化したジオメトリファイルが使われているのがわかります。

Note

出力ジオメトリファイルのファイル名パターンはFile Mergeノードで設定し、ROP Output Driverから参照されます。パターンには、$CLUSTER(シミュレーションするクラスタ番号)と$F(現在のフレーム)変数を組み込まなければなりません。

ライブシミュレーションをオフ

一度HQueueネットワークがジオメトリを生成してしまうと、元のシミュレーションネットワークをクッキングするのを止めてください。なぜなら、その時点で最終結果をキャッシュ化しているからです。

以下のどれかを行なってください:

  • クッキングするのにシミュレーションを必要とするシーンレベルオブジェクトの表示をオフにします。

  • Houdiniでシミュレーションをオフにします。つまり、メインウィンドウの右下のシミュレーションメニューをクリック(または、押したまま)して、 Enable Simulation をオフにします。

  • 新規で.hipファイルを作成して、Fileサーフェスノードを使って、生成されたパーティクル流体ジオメトリファイルを読み込みます。

ファーム上に分散されたシミュレーションを実行

  1. メインメニューから Render ▸ Edit Render Node ▸ distributedsim を選択します。パラメータエディタで:

    • シミュレーションしたいフレーム範囲を設定します。

    • Slice Divisions パラメータをチェックします。3つの成分の積が、パーティクル流体シミュレーションの領域の数となります(例えば、3, 1, 1は3つの領域でシミュレーションします)。

      この数字は、 Distribute ツールがレンダーノードを作成するときに自動的に設定されます。とはいえ、戻ってスライスの数を変更(例えば、Slice Along Lineノードの Number of Regions パラメータを変更する)する場合、レンダーノードでこのパラメータを更新する必要があります。

    • HQ Server にHQueueサーバーのホスト名とポートを設定します(例えば、render.example.com:5000)。

  2. パラメータエディタで、 Render をクリックするとジョブがHQueueに送信されます。

    レンダーノードは、その情報をHQueueサーバーに送信します。HQueueサーバーはコマンドをクライアントマシンに送信して、.hipファイルを読み込み、フレーム毎にパーティクル流体シミュレーションのスライスをシミュレーションして保存します。個々のクライアントマシンは、生成したジオメトリキャッシュファイルを共有ネットワークディレクトリに保存します。

ダイナミクス

ダイナミクスの学習

衝突オブジェクト

シミュレーションタイプ

次のステップ