TOPネットワークについて


この記事では、TOPネットワークの基本概念と、それらを使って行えることについての概要を説明します。

概要

 TOPネットワークは、コンピューターが実行するワークアイテムを生成するための「レシピ」を記述し、それらを単一のマシンまたはレンダーファーム上のプロセスで効率的に実行し、各ノードの依存関係を算出し、できるだけ多くのアイテムを並列に実行できるようにします。 生成された「レシピ」は、実行するワークアイテムとそれらの依存関係を記述する基礎となるPDG(Procedural Dependency Graph)です。

 たとえば、地形、道路のレイアウト、さまざまな建物のアセット、木の散らばり、Street Furnitureの配置などを含む都市生成ワークフローがあるとします。 一部のステップは並行して実行でき、一部のステップは他の特定のステップが完了するまで開始できません。

 手動で書かれたスクリプトを使用して都市の建設を自動化するのであれば、おそらくそれを別々の「パス」(地形生成、道路レイアウト、建物など)に分割します。 これは、パス内およびパス間の並列実行の機会をほぼ確実に見逃しているため、実際にはかなり非効率的です。 並列実行が行えれば、たとえば、特定の地形のタイルが完成したら、他のタイルを待たずに道路を敷設したり、木を散りばめたりすることができます。

 最終的なアウトプットを作成するのに必要とされる全てのワークの間に依存関係のネットワークを確立することによって、TOPは都市のレシピを「クックする」より効率的な方法を見つけることができます。 また、変更された情報にどの部分が依存しているかをネットワークが認識しているため、何かが変更されたときに都市のシーンを「再クック」するために必要な最小限の作業を行うこともできます。

 Houdiniの機能としてのTOPネットワークは、シミュレーション、レンダリング、合成などのエフェクト作業の達成に向けられていますが、TOPのシステムは、Houdiniに限らず、依存関係を持って個々のアイテムに分割される可能性がある、あらゆる種類の作業に役立ちます。

 TOPノードのネットワークを構築して、実行するワークと結果を操作する方法を指定します。 TOPノードは、ワークを行うための、またはアトリビュートに情報を格納するためのワークアイテムを生成します。 TOPノードには、主に2つのタイプがあります。Processorは新しいワークアイテムを生成し、Partitionはアイテム間の依存関係を作成するため、Partition内のすべてのアイテムが終了するまで待機します。

 

ワークアイテム

  • TOPネットワーク内の各Processorノードは、一定数のワークアイテムを生成します。 ノードによって作成されたワークアイテムは、ネットワークエディタのノード本体内に表示されます(詳細については、下記のネットワークインタフェースを参照してください)。
  • 多くのワークアイテムは、「ジョブ」、つまり単一のコンピューター上のプロセスまたはレンダーファーム上で実行されるスクリプトまたは実行可能ファイルを表します。 ただし、ワークアイテムの中には単にアトリビュートを保持するためのものがあり、これらは実際にワークを行わせることはありません。

    たとえば、HDA Processorノードによって作成されたワークアイテムはワークを表します。それらは入力ファイルでHoudiniアセットを作成します。 しかし、ファイルパターンノードによって作成されたアイテムは、単に一致した各ファイルパスの保持しているだけです。 下流のProcessorのワークアイテムには、これらのファイル名を使って何かをすることが期待されています。

 

アトリビュート

 ワークアイテムには、Houdiniジオメトリ内のポイント上のアトリビュートと同様の情報が命名されたアトリビュートが含まれています。 ワークがアトリビュートを読み取ってそのワークを制御できる場合。 アトリビュートは「親」ワークアイテムから作成されたワークアイテムに渡されるため、ワークアイテムの結果がその子アイテムの処理に影響を与え、アイテムをグループ化して、ネットワークを介して情報を渡すことができます。

 カスタムコードはワークアイテムの生成を制御するためにアトリビュートを読み取ることができますが、アトリビュートの最も一般的な用途は、TOPノードやHoudiniネットワーク、あるいはTOPネットワークによって参照されるノードのパラメータでそれらを参照することです。

  • たとえば、さまざまなレンダリング品質を設定したいとしましょう。 Wedge TOPを使用して、pixelsamplesアトリビュートを異なる値に設定したワークアイテムを作成できます。 次に、ROP Mantra Render TOPで、@pixelsamplesを使用してアトリビュート値を参照するPixelサンプルを設定できます。
  • TOPネットワークによって呼び出される外部アセット/ネットワークでワークアイテムのアトリビュートを参照することもできます。 たとえば、HDA Processorは各ワークアイテムに対してHoudiniアセットを作成します。 そのアセットのパラメータで@Attributeのリファレンスを使用して、ワークアイテムから値を取得することができます。

ノードとカスタムコードは任意のアトリビュートを追加できますが、ワークアイテムには常にアクセス可能ないくつかの組み込みアトリビュートもあります。

詳しくは、アトリビュートの使用を参照してください。

 

Processors、Partitions、Mappersについて

Processors

 Processorsは新しいワークアイテムを生成します。 Processorsは、以前のワークアイテムに基づいて複数の新しいワークアイテムを生成できます(「ファンアウト」)。

 Processorノードは、ノードのパラメータに基づいて新しいワークアイテムを最初から作成することも、入力ノードから受信したワークアイテムから新しいワークアイテムを生成することもできます。 多くのノードが両方の方法で機能します。 Wedgeノードに入力がない場合は、パラメータで指定された数のWedgeに対してワークアイテムを作成します。 入力がある場合は、Wedge数と入力ワークアイテムの数をかけた数だけ、新しいワークアイテムを作成します。

 Processorノードが「親」アイテムに基づいて新しい「子」ワ-クアイテムを生成すると、親のアトリビュートが渡されるので、ワークアイテムは結果を下流に渡すことができます。

Partitions

 Partition ノードは、さまざまな基準に基づいて入力ワークアイテムを結合します。これが、PDGがさらに処理するために複数のワークを1つのワークにまとめる方法です(「ファンイン」)。異なるPartition ノードは、上流のワークアイテムを異なる方法でグループ化します。

ワークの分割には2つの効果があります。

  • グループ化されたワークアイテム間に依存関係が作成されるため、グループ内のすべてのワークアイテムが完了するまでPartitionは処理を続行しません。
  • グループ化されたワークアイテムのアトリビュート値を(オプションで)マージします。したがって、たとえば、Partition から作成されたすべてのワークアイテムは、入力アトリビュートとしてグループ化されたワークアイテムから出力ファイルパスの集約リストを受け取ります。

 最も一般的に使用されるPartition ノードは、すべての入力ワークアイテムを単一のPartitionにグループ化するWait for Allです。これにより、Partition はすべての上流のワークが完了するのを待機してから先に進みます。

 アトリビュートに基づいて(たとえば、同じフレーム上で機能したすべてのアイテムをグループ化するなど)、カスタム関数によって、または空間的にPartition 化できます。たとえば、地形の上に木を点在させる場合、地形をグリッドに分割し、特定のタイル内にジオメトリを生成するすべてのアイテムをグループ化することができます。

 それ自体では、Partition ノード内のアイテムは何もしません。それらはグループ化されたワークアイテムのマージされた情報を保持するだけです。その後のワークアイテムは、マージされた情報に対して機能します。

Mappers

 Mapperは、グラフ内の関係のないワークアイテム間の依存関係を確立します。 それらは通常の使用ではあまり必要ではありません。 たとえば、2つの異なるノードチェーンでワークを生成しているが、一方のチェーンでのワークが、実際にはもう一方のチェーンの終了に依存していることをシステムに伝えたい場合などに使われます。

Schedulers

 スケジューラノードは実際にはワークアイテム内で実行ファイルを実行します。

  •  スケジューラの種類が異なると、実行可能ファイルを実行する方法も異なります。 たとえば、ローカルスケジューラはローカルマシン上のプロセスプールを使用して実行可能ファイルを実行し、HQueueスケジューラは実行可能ファイルをHQueueレンダーファームに配置します。
  • TOPネットワークには複数のスケジューラノードを設定でき、状況に応じてさまざまな方法でネットワークをクックするように設定できます(たとえば、変更をテストしながら最新のプロセスの一部をファームの一部としてクックする場合など)。 TOP ネットワークノードのDefault TOP Schedulerパラメータは、ネットワークを構成するために使用されるスケジューラを制御します。

 

簡単なサンプル

右側の簡略図は、5つのアニメーションフレームをさまざまな品質レベルでレンダリングし、同じフレームの画像について、それぞれの品質の出力結果を並べる画像を作成するための基本的なネットワークを示しています。

  1. Wedgeノードは、Wedgeバリアントを含む4つの「ダミー」ワークアイテムを生成します(たとえば、MantraのPixel Samplesパラメータに異なる値が入っている)。
  2. ROP Mantra Renderノードを追加して、フレーム範囲を1〜5に設定します。これにより、各「親」アイテムに対して5つの新しいワークアイテムが生成されます。Wedgeアトリビュートは新しいワークアイテムに渡されます。
  3. フレームごとの分割ノードは、同じフレーム番号を持つワークアイテムへの依存関係を持つ新しい「Partition」アイテムを作成します。これにより、次のステップに進む前に、同じフレームのすべてのバリアントが処理されるまでPartitionが待機します。
  4. ImageMagickノードは、各フレームのレンダリングされたバリアントを取得し、それらをまとめて比較画像を作成するための新しいワークアイテムを生成します。

    もちろん、比較画像内の各画像にどの設定が対応するかを示す、テキストをオーバーレイするようにすることもできます。

  5. 最後のWait for Allノードは、すべてのワークが終了するのを待つPartitionアイテムを生成します。

    これにより、すべての「メイン」ワークが完了した後にのみ実行される「Wait for All」の後にワークアイテムを追加できます。これは、例えば、レンダリング後のスクリプトやワークが完了したことをユーザーに通知などが挙げられます。

詳細については、よく利用されるTOPノードの紹介を参照してください。

 

静的ワークアイテムと、動的ワークアイテム

静的ワークアイテム

 TOPネットワークが実行を開始する前の段階で、ノードパラメータに基づいて、いくつかのワークアイテムが必要になることが知られています。 これらは静的ワークアイテムと呼ばれます。

 たとえば、入力のないROP Mantra TOPでは、レンダリングするフレームごとにワークアイテムが生成され、レンダリングするフレーム数はパラメータで設定されるため、ワークアイテムの数は事前にわかっています。 そして、次のノードが各入力ワークアイテムに対して新しいワークアイテムを生成するだけであれば、そのワークアイテムも「静的に」認識されます

動的ワークアイテム

 ワークアイテムは、ワークが完了して初めて生成されるものもあります。 これらは動的ワークアイテムと呼ばれます。

 たとえば、クラウドエージェントの上にある2次シミュレーションでは、各タイルに含まれるエージェントの数に基づいて、クラウドをタイルに分割することがあります。 これは、群衆シミュレーションを生成してファイルを読み込んだ後にのみ動的に実行されます。

静的ワークアイテムが好ましい理由

 一般的な経験則として、静的、動的のどちらでもワークアイテムを作成できる場合は、静的ワークアイテムを利用した方が好ましいです。ワークアイテムの数が表示され、作業量がわかるので、Houdiniはより正確な完了率の推定値を得ることができます。

 もちろん、動的なワークは避けられないかもしれません。 しかし、ワークが静的であることをHoudiniが認識できない場合があるので、ワークは動的または静的のどちらで検討するかを選択できます。 このような場合、TOPネットワークは実行時にどのワークアイテムが必要かを常に把握できるため、ワークを動的にマークすることは常に安全です。 ただし、ワークアイテムが静的であることがわかっている場合は、静的アイテムの利点を得るためにノードを静的としてマークする必要があります。

  • 一部のProcessorノードには、[静的]、[動的]、または[自動]を選択できる[ワークアイテムの生成]メニューがあります([自動]は、このノードに静的生成が可能な場合、または入力がない場合は静的を生成します)。 動的にしか動かない場合や静的にしか動かないProcessorには、このオプションはありません。

  • 一部のPartitionノードには、Use dynamic partitioningというパラメータがあります。 Partition化が動的に生成された情報に依存する場合は、これをオンにしてください。 Partition化が、最も近い上流の静的ワークアイテムですでに「わかっている」情報にのみ依存している場合は、オフにします。この場合、グルーピングは静的に計算することもできます。 (ノードがどのように機能するかによって動的または静的Partition化が指示される場合、一部のPartition ノードではこのオプションが提供されない場合があります。)

結果がキャッシュされていない(ノード内にワークアイテムがない)TOPネットワークがある場合は、ネットワークエディタでTOPs->Generate Static Work Items を選択して、静的に認識されているすべてのアイテムを生成できます。 これは、ネットワークにどれだけのワークが関与しているかを把握するのに役立ちます。

TOPノードネットワークインターフェイス