Houdini 19.5 PDG/TOPsを使ってタスクを実行する方法

フィードバックループ

For-Eachブロックを使用することで、ワークアイテムに対して一連のオペレーションをループで処理することができます。

On this page

概要

TOPs Feedback Loopブロックは、一連の 直列による実行 工程を 何回も 実行することができます。

TOPネットワークは既になんというか並列ループのような挙動をしています。 というのも、TOPネットワークはスケジューラの設定に基づいて可能な限り同時にたくさんのワークアイテムを実行します。 つまり、“入力別に同じアクションを繰り返す”挙動はまさにTOPネットワークの挙動そのものなので、通常ではループを構築する必要がありません。

とはいえ、場合によっては並列ではなく直列に一連の工程を実行して、前のワークアイテムの出力をそれ以降のワークアイテムの入力として使用したいことがあります。 単純なシミュレーションなら、このような処理は既にROP Fetchノードを使えば制御することができます。このROP Fetchは同時に1ジョブ1フレームとして実行するバッチを生成することができます。 複数のノードが絡んだループまたはループさせる回数がまだわからないといったもっと複雑な使い方になると、 フィードバックループ を使用した方が良いです。

フィードバックループのブロック内では、TOPネットワークはノード毎にワークアイテムを実行するのですが、下流のワークアイテムが上流のワークアイテムに依存した状態で、それらのワークアイテムを直列に実行します。 そして、1回目のループですべてのワークを完了させた時に、そのブロックに2回以上のループ回数が指定されていれば、Beginノードに戻って次のループに進みます。

Tip

設定によっては、フィードバックループのブロックは、並列で 複数の直列ループ を実行する こともできます

例えば、1回づつ一握りのビー玉を瓶に詰めていくRBDシミュレーションを想像してみてください。 この処理全体を単一シミュレーションで実行することができますが、瓶の底に積み上がっていくビー玉は安定せず、次々にシミュレーションされるオブジェクトの数が増え続けていきます。 これを管理する1つの方法は、1回目に詰める一握りのビー玉に対してRBDシミュレーションを実行し、その結果を2回目のシミュレーションの静的オブジェクトとして使用することです。 3回目のシミュレーションでは、1回目と2回目のシミュレーションの結果を合わせたビー玉を静的オブジェクトとして使用します。それ以降のシミュレーションも同様です。 TOPsでは、ROP GeometryとFeedback Loopをループブロック内で使用することで、このような処理が可能になります。

(Feedback Loopはコマンドサーバーチェーンの実装でも使用します。その場合、1回づつコマンドをサーバーに順々に送信してください。)

How to

To...Do this

Feedback Loopブロックを作成する

  1. TOPネットワークエディタで⇥ Tabを押して“For-Loop with Feedback”を選択します。

    このツールはBlock Begin FeedbackノードとBlock End Feedbackノードを配置します。

  2. Block Begin Feedbackノードを選択します。パラメータエディタで、反復回数の指定方法を選択します:

    • デフォルトでは、 Iterations パラメータで指定された反復回数だけループが実行されます。Block Begin Feedbackノードに上流のワークアイテムが接続されていれば、その入力のワークアイテム毎にiterations回だけループが実行されます。

      例えば、指定した反復回数でシーンを何回も構築していくようなループ(例えば、概要で説明した“ビー玉を瓶に落とす方法”)で使います。 Block Begin FeedbackノードにWedgeノードを接続すれば、そこから生成されたワークアイテム毎にループを繰り返すことができます。

    • Block Begin Feedbackノードに静的なワークアイテムが含まれていれば、 Iterations from Upstream Items を有効にすることができます。これは、反復回数に上流のワークアイテムの数を設定します。これによって、入力のワークアイテム毎に1回だけブロック内の一連の工程が繰り返されます。

      例えば、ディレクトリ内のすべてのファイルをリストするFile Patternノードとそのファイル毎に反復するループブロックを使用することで、その内容を一時ファイルに追加していくことができます。

  3. Block Begin Feedbackノードが動的にワークアイテムを生成する場合、Block End Feedbackノードの Use Dynamic Partitioning も有効にしなければなりません。

  4. そのBeginノードとEndノードの間にノードを接続することで、それらのノードをループの一部にすることができます。

    このループを可視化するために、Houdiniはブロック内のノードを囲んだ境界を描画します。

ループ内のワークアイテムに基づいて“副タスク”を並列でクックする

ループ内のノードからループ外のプロセッサに接続した場合(つまり、ループのEndノードに接続しなかった場合)、そのプロセッサのワークアイテムは、ループ内のワークアイテムに基づいて生成されるようになりますが、 通常通りに並列でスケジュールが組まれるようになります。

これは、ループ内のワークアイテムに基づいているもののループさせる必要のない“副タスク”で役立ちます。 例えば、ループ内では画像を生成してからその画像を制御していきたいような場合では、ループ外ではその生成された画像のサムネイルを並列で生成することができます。

Tipsとメモ

  • フィードバックループにはどのプロセッサノードも使用することができます。とはいうものの、現在のところ、フィードバックループ内では動的なパーティショナまたはマッパーを使用することは できません 。パーティションに同じループ回数目からのワークアイテムのみを含める場合であれば、 静的な パーティショナーを使用することが できます 。別のループ回数目のワークアイテムを無理やりパーティション化すると、そのパーティションノードはエラーを報告します。

  • ブロックのBeginノードとEndノードは、その関係性をわかりやすくするために同じカラーを設定してください。For-Loopツールで配置されたデフォルトのノードのカラーはオレンジですが、そのノードのカラーを変更することができます。これは特に入れ子化したループと区別するのに役立ちます。

    ブロックを囲んだ境界は、Endノードのカラーと同じになります。

  • Beginノードは、ループさせるワークアイテムを生成するプロセッサです。

  • 各ワークアイテムは、同じループの前のワークアイテムに依存し、その反復回数とループ番号を識別するためのアトリビュートを持っています。

    Block End Feedbackノードは、関係しているループの反復に基づいてワークアイテムをパーティション化するパーティショナーです。 フィードバックループ内のノードは自由に必要な数だけワークアイテムを追加していくので、パーティショナーはそれらのワークアイテムを収集することができて便利です。 Beginノード内の2回目のループのワークアイテムは、1回目のループのパーティションに依存します。それ以降のループも同様です。 ループが動的にワークアイテムを生成する場合、そのBlock End Feedbackノードの Use Dynamic Partitioning も有効にしなければなりません。

  • フィードバックブロック外のノードを、フィードブロック内の複数入力を持ったノードに接続することができます。

PDG/TOPsを使ってタスクを実行する方法

基本

初心者向けチュートリアル

次のステップ

リファレンス

  • すべてのTOPsノード

    TOPノードは、データをネットワークに送り込んでワークアイテムに変換し、色々なノードでそれを制御するワークフローを定義します。たいていのノードは、ローカルマシンまたはサーバーファーム上で実行可能な外部プロセスを表現しています。

  • プロセッサ系ノードコールバック

    プロセッサ系ノードはスケジューラで実行可能なワークアイテムを生成します。

  • パーティショナー系ノードコールバック

    パーティショナー系ノードは複数の上流ワークアイテムを単一パーティションにグループ化します。

  • スケジューラ系ノードコールバック

    スケジューラ系ノードはワークアイテムを実行します。

  • 独自のファイルタグとハンドラー

    PDGはファイルタグを使用して出力ファイルのタイプを決めます。

  • Python API

    ディペンデンシーグラフを扱うためのPython PDGパッケージのクラスと関数。

  • Job API

    ジョブスクリプトで使用するPython API

  • ユーティリティAPI

    Python pdgutilsパッケージのクラスと関数は、PDGノードでの使用だけでなく、スクリプトやプロセス外のジョブスクリプトでの使用も想定されています。