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

TOPネットワークをクック/実行する方法

TOPネットワークに実際にワークを処理させて、そのネットワークで指定されたとおりに結果を生成させる方法。

On this page

TOPネットワークパフォーマンスを可視化する方法も参照してください。

概要

TOPネットワークは、以前のクックで変更された(または、とっくに既に変更された)ワークのみを再処理することで余計なワークを最小限に抑えようと試みます。 つまり、何も変更がなければ、まったくクックされません。

TOPsでは、最新でない(またはそう疑われる)ノードを再クックする必要が出た場合に、それらのワークアイテムを“Dirty(変更あり)”としてマークする概念を取り入れています。 以下に、TOPネットワークが何を基準に再クックの有無を判断しているのかを説明しています。

  • ノードが以前のクックで生成したものと異なったワークアイテムを生成した場合、その以降のすべてのノードが“Dirty”としてマークされます。

  • 外部ファイル (TOPネットワーク内で生成されていないファイル)を扱うノード、例えばFile PatternGeometry Importを実行した時にそれらのファイルを走査して、該当するファイルに変更があった場合には、既存のワークアイテムが“Dirty(変更あり)”としてマークされます。

  • 外部のHoudiniノードを参照したノード(例えば、ROP Geometry Output)を実行した時にその参照データをチェックして、そのデータに変更があった場合には、既存のワークアイテムが“Dirty(変更あり)”としてマークされます。

  • 現在のところ、TOPsは入力ファイルと出力された結果ファイルをチェック しません 。例えば、中間ファイルを削除もしくは置換しても、そのファイルを入力として使用したワークアイテムは自動的に“Dirty(変更あり)”としてマーク されないです

  • 最後のクックから変更のあったアトリビュートを持つすべてのワークアイテムが“Dirty(変更あり)”としてマークされます。

  • ノードのパラメータを変更すると、そのノードのワークアイテムが“Dirty(変更あり)”としてマークされます(その理由は、ほとんどのワークアイテムは、入力のワークアイテムとパラメータ値に基づいて生成されているからです)。

    TOPノードのパラメータを変更すると(要するに、ノードを再クックさせると)、そのノードの隣のステータスアイコンが薄暗くなります:

  • 手動でワークアイテム、ノード、ネットワーク全体を“Dirty(変更あり)”としてマークすることで、それらを強制的に再クックさせることができます。

クックさせる方法

To...Do this

クックを必要とするネットワークの一部をクックする

Tasks ▸ Cook Output Node を選択します。

(クックを必要とする場合にのみ)単一ノードをクックする

  • ノードを選択して、 Tasks ▸ Cook Selected Node を選択します。

    または

  • ノードを右クリックして、 Cook this node を選択します。

強制的にHoudiniにネットワーク全体を再クックさせる

Tasks ▸ Dirty and Cook Output Node を選択します。

強制的に単一ノードをクックさせる

  • ノードを選択して、 Tasks ▸ Dirty and Cook Selected Node を選択します。

    または

  • ノードを右クリックして、 Dirty and Cook this node を選択します。

ネットワーク全体をDirty(変更あり)としてマークしつつ、まだ再クックさせない

Tasks ▸ Dirty All を選択します。

すべての静的なワークアイテムを生成するも、何もクックしないようにする

Tasks ▸ Generate Static Work Items を選択します。

特定のノードのワークアイテムを動的または静的で生成する

ノードを右クリックして、 Generate Node を選択します。

単一ワークアイテムを再クックする

ワークアイテムのドットを右クリックして、 Cook Task を選択します。

単一ワークアイテムをDirty(変更あり)としてマークしつつ、まだ再クックさせない

ワークアイテムのドットを右クリックして、 Dirty Task を選択します。

ローカルスケジューラで使用されるリソースの数を制限する

リソースを制限する方法を参照してください。

ファーム上でグラフ全体をクックし、現行セッションから接続解除する

各ファームスケジューラノードには、このために Submit Graph As Job という名前のUIが備わっています。 サンプルは、HQueueを参照してください。

出力フラグと出力ノード

  • TOPネットワーク内では、出力フラグは、そのTOPネットワークが“動作させる”ノードを制御します。TOPネットワークをクックさせると、出力フラグを持ったノードから上流のノードのみがクックされます。

  • TOP サブネットワーク 内では、そのサブネットワークにOutputノードが存在すると、そのOutputノードがそのサブネットの出力になり、他の出力フラグが無視されます。

  • TOPサブネットワークの中に複数のOutputノードを作成すると、そのサブネットはSplit TOPと同様に複数の出力コネクタを持つようになります。

コマンドラインからクックする方法

パイプラインでは、何かのスクリプトから非インタラクティブでTOPネットワークを実行させたいといったことがよくあります。

To...Do this

HScriptからTOPネットワークをクックする

hbatchを実行するとHScriptコマンドライン環境が得られます。 topcook HScriptコマンドを使用することでTOPネットワークを実行することができます:

% hbatch myscene.hip
hbatch Version ... (Compiled on ...)
help topcook
topcook /tasks/topnet1

Pythonを使ってTOPネットワークをクックする

hythonコマンドラインプログラムからtopcook.pyユーティリティスクリプトを実行する方法:

% hython $HHP/pdgjob/topcook.py --hip myscene.hip --toppath /tasks/topnet1
Running Houdini ... with PID ...
Loading .hip file .../myscene.hip
Given Node 'topnet1', Cooking Node '..'
Local Scheduler: Max Slots=..., Working Dir=...
Finished Cook
Work Item States:
...

HOMからクックする方法

To...Do this

HOMスクリプトでTOPネットワークをクックする

HOMを使ってHoudiniにTOPネットワークをクックさせるには、まず親ネットワークを検索し、そのネットワーク内でOutput/Displayフラグが有効になっているTOPノードを検索し、そのノードに対してhou.TopNode.cookWorkItemsメソッドをコールします。

hou.hipFile.load(graph_file)
net = hou.node('/tasks/topnet1')
to_cook = net.displayNode()

# PDGグラフのクックをブロックします。
to_cook.cookWorkItems(block=True)

ファイル変更を監視しながらTOPネットワークをクックする

上記と同様ですが、ループでファイル変更を監視しながらクックしています。 ファイルの代わりに、Perforceの変更をチェックしたり、メッセージキューをポーリング(問い合わせ)するのも良いでしょう。 単にmtimeをチェックするのではなくて堅牢なファイル監視ライブラリを使用することで、これを改良することができます。

import hou
import os
import time

graph_file = '/tmp/doit.hip'
watch_file = '/tmp/watch.txt'

hou.hipFile.load(graph_file)
net = hou.node('/tasks/topnet1')
to_cook = net.displayNode()

# 必ずネットワーク(TOPネットワークから作成されたPDGネットワーク)を初期化してください。
to_cook.cookWorkItems(block=True, tops_only=True)

print('Watching for changes - Ctrl-C to exit...')

mtime = os.path.getmtime(watch_file)
try:
    while True:
        mtimep = os.path.getmtime(watch_file)
        if mtimep != mtime:
            mtime = mtimep
            # PDGグラフのクック(実行)をブロックします。
            to_cook.cookWorkItems(block=True)
            # PDGグラフをリセットします。
            to_cook.dirtyAllTasks(False)
        time.sleep(1)
except KeyboardInterrupt:
    print('Finished')

TOPネットワークのクックコントロールを任意のノードに追加する方法

TOPネットワークのクックコントロール を任意のノードに追加することで、ノードネットワーク内のそのノードからTOPネットワークのクックを制御することができます。

これは、トップレベルのネットワークとは別のノードネットワーク内のレベルに存在するTOPネットワークのクックを制御したい時に非常に役立ちます。

例:

  • TOPネットワークを含んだHDAがあって、そのHDAのインターフェースからそのTOPネットワークのクックを制御したい場合、そのTOPネットワークのクックコントロールをそのHDAに追加することができます。これによって、HDAの中に入ることなくTOPネットワークのクックを制御することができるようになります。

  • 別々のレベルで複数のTOPネットワークが存在している複雑なノードネットワークがある場合、それらのTOPネットワークを表現した Nullノードを最上レベルのネットワークに追加して、それらのNullノードにTOPネットワークのクックコントロールを追加することができます。これによって、TOPネットワークのクックコントロールに素早くアクセスできるようになるだけでなく、ネットワークエディタ内のそれらのNullノードにクック進捗バッジとカウントを表示させることができます。

How-to

  1. TOPネットワークのクックコントロールを追加したいノードを選択します。

  2. Edit Parameter Interface ウィンドウを開きます。

    この操作は以下のどれかで行なうことができます:

    • ネットワークエディタ内でそのノードをクリックして表示されるコンテキストメニューから Parameters and Channels ▸ Edit Parameter Interface を選択します。

    • そのノードのパラメータエディタで、 ギアメニューアイコン ▸ Edit Parameter Interface を選択します。

  3. 開かれた Edit Parameter Interface ウィンドウ内で、 Create Parameters 列 > Node Properties タブを選択します。

  4. Node Properties タブ内で、 TOP Network Properties ▸ TOP Cook Controls ▸ TOP Network Cook Controls を選択します。

  5. 以下のどれかを実行します:

    • 右矢印をクリックして、それらのパラメータを Existing Parameters 列へコピーします。

    • 選択されているパラメータを Existing Parameters 列内にドラッグします。

  6. Accept をクリックします。

    すると、選択したノードのパラメータエディタ内に TOP Network Cook Controls が表示されます。 以下のパラメータセクションを参照してください。

  7. TOP Network Cook Controls タブの Top Network パラメータフィールドには、クックコントロールをリンクさせたいTOPネットワークを指定します。

すると、 TOP Network Cook Controls ボタン を使用して、そこで指定したTOPネットワーク内のすべてのTOPノードのすべてのワークアイテムのクックを制御することができるようになります。

指定したTOPネットワークのクックの進捗バッジとカウント、そのTOPネットワークのすべてのワークアイテムのドットまでもが、ネットワークエディタ内のそのノードで表示されるようになります。

パラメータ

TOP Network Cook Controls

Top Network

クックコントロールに関連付けるTOPネットワークのパスを指定します。

パス構文の詳細は、ノードとパラメータのパスを参照してください。

Generate Static Work Items

TOPネットワーク内のすべてのノード内に静的なワークアイテムを生成します。 どのワークアイテムもクックされず、動的ノードも何もしません。

Cook Output Node

TOPネットワーク内の出力ノードとそこに接続されているDirty(変更あり)ノードをクックします。 TOPネットワーク内の すべて のノードを再クックしたいのであれば、まず最初に Dirty All をクリックしてから、このボタンをクリックしてください。

Cancel Cook

TOPネットワーク内のノードが現在クック中の場合、それらのクックをキャンセルします。

Dirty All

TOPネットワーク内のすべてのTOPノード内のすべてのワークアイテムをDirty(変更あり)にして、それらすべてのノードが再クックを必要とすることをマークします。

Delete All File Outputs From Disk

以前のクックファイルすべてを削除してから、TOPネットワーク内のすべてのTOPノードのすべてのワークアイテムをDirty(変更あり)にします。

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

基本

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

次のステップ

リファレンス

  • すべてのTOPsノード

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

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

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

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

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

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

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

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

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

  • Python API

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

  • Job API

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

  • ユーティリティAPI

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