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

PDGとレンダーファームスケジューラの統合

異なるスケジューラを使って、ワークのスケジュールを組んで実行する方法。

On this page

概要

ネットワークを走らせる際にあなたが指定したワークを実際に処理させるには、 何か が、実行準備の整ったコマンドを受け取って、その実行環境を構築して、それらのコマンドを実行しなければなりません。 TOPネットワークでは、この 何かスケジューラ ノードに相当します。

TOPネットワーク内に2個以上のスケジューラノードを配置することができますが、そのネットワークをクックするスケジューラは、TOP Networkノードで指定します。

TOPネットワーク内に複数のスケジューラを配置することで、異なる“プロファイル”をセットアップして、スケジューラ間でそれを切り替えることができます(例えば、小規模なテストをする時にはローカルスケジューラを使用し、プロダクションでフル稼働させる時にはレンダーファームスケジューラに切り替えることができます)。

特定のノードで使用するスケジューラをオーバーライドすることができます。 これによって、ローカルで軽いジョブを実行してファイルシステムの修正を行なうことができるので、ファームにそれらのジョブを送信するオーバーヘッドの負荷を回避することができます(さらに、一部のノードをまったくスケジュールに組ませずにメインプロセスでワークを処理するためのオプションがあります)。 他にも、スケジューラノードは特定のトップレベルのジョブパラメータをオーバーライドすることもできます。

Tip

スケジューラノードのRMBメニューから Set As Default Scheduler を選択することで、デフォルトのスケジューラを切り替えることができます。

新しいTOPネットワークに対してデフォルトのスケジューラノードは、プロセスキューを使ってワークのスケジュールを組みます。 作業負荷によりますが、これによってオーバーヘッドが小さくなるため、実際にレンダーファームを使用するよりも高速化することができます。

すぐに使えるように、TOPsにはいくつかのレンダーファームパッケージ用のビルトインのスケジューラノードが用意されています(以下参照)。

TOPsは、制御マシンとすべてのサーバーがネットワークファイルシステムを共有している場所で分散されたセットアップのみを扱います。

スケジューラのタイプ

Local Scheduler

デフォルトのスケジューラ:ローカルマシン上のプロセスキューを使って、ワークのスケジュールを組みます。

HQueue Scheduler

これはHoudiniの無料の管理ソフトウェアで、小規模なレンダーファームに適しています。 HQueueのインストール方法を参照してください。

Deadline Scheduler

Thinkboxソフトウェア社の計算管理ツールキットです。

Tractor scheduler

Pixar社のレンダー管理ソフトウェアです。

In Process Scheduler

In-Processワークアイテムのスケジューリングを制御します。これはHoudiniプロセス内で非同期的に実行されます。

カスタムスケジューラ

カスタムスケジューラのバインドを使用することで、他のサードパーティ製または内製のソフトウェアと統合させることができます。

スケジューラのオーバーライド(上書き)

To...Do this

単一ノードで使用するスケジューラをオーバーライドする

  1. オーバーライドしたいスケジューラのノードを選択します。

  2. パラメータエディタで、 Schedulers タブをクリックします。

  3. TOP Scheduler Path に、使用したいスケジューラノードのノードパスを設定します。

    たいていの場合、TOP Networkノードは(サブネットを使わずに)トップレベルで全体を定義するので、TOP Networkノードはスケジューラノードと同じレベルにいるようなものです。 その場合、スケジューラの相対パスは、local_schedulerといったスケジューラノードの名前だけになります。

    別の方法として、フィールドの隣にあるノード選択アイコンをクリックすることで、インタラクティブにスケジューラノードを選択することができます。 この方法だと、スケジューラの絶対パスが入ります。

TOP Networkノードで指定されたデフォルトのスケジューラを使用するようにノードの設定を戻すには、このノードの TOP Scheduler Path フィールドを空っぽに設定してください。

Scheduler Job Parms / Properties

To...Do this

単一ノードのジョブ実行パラメータをオーバーライドする

スケジューラには、スケジュールの組み方とコマンドの実行方法に関する個々のパラメータがあります。それらの設定の一部をノード単位でオーバーライドすることができます。 TOPsはプロパティシステムを使用してスケジューラ設定をオーバーライドします。 例えば、特定のノード内のワークアイテムに対して何かしらの環境変数を設定したいことがあります。

  1. オーバーライドしたいスケジューラのノードを選択します。

  2. パラメータエディタで、 Schedulers タブをクリックします。

  3. Add Job Parms ボタンを押します。これは、登録されているすべてのスケジューラ(カスタムスケジューラを含む)のメニューを開きます。

  4. あなたが使用しているスケジューラを選択します。これは、選択した正しいプロパティフォルダでEdit Parameter Interfaceウィンドウを開きます。

  5. 選択したフォルダには、そのスケジューラで利用可能なすべてのプロパティが含まれています。

  6. オーバーライドしたいスケジューラプロパティを Existing Parameters ペイン上にドラッグ、または、ボタンを押します。 スケジューラプロパティがこのノードのインターフェース上に追加されると、そのスケジューラノードで指定されている値がオーバーライドされます。

    Note

    そのスケジューラがこのノードをクックしている時にのみオーバーライドが適用されます。

自動的にJob ParmsをTOPノードに追加する

パイプラインでは、場合によっては特定のJob Parmsを常に特定のノードに対して追加する必要があります。 例えば、ROP Mantra Renderノードはレンダーライセンスを使用するので、HQueue Scheduler 'Resources' Parmプロパティを自動的に追加したいです。 これは、$HOUDINI_PATHイベントスクリプト(例えば、scripts/top/ropmantra_OnCreated.py)を追加し、必要に応じてプロパティを追加するロジックを足すことで可能です:

n = kwargs['node']
templ = hou.properties.parmTemplate('top', 'hqueue_resources')
parmtuple = n.addSpareParmTuple(templ, ('Schedulers','HQueue'), False)
parmtuple.set(['sidefx.license.render'])

さらに、ワークアイテムアトリビュートを使用してクック時の正しい値を決めるHScriptエクスプレッションをパラメータ値に設定すると良いでしょう。 例えば、ライセンスタイプがrenderlicenseワークアイテム文字列アトリビュートに格納されている場合:

# ...
parmtuple.set(['`@renderlicense`'])

ローカルスケジューラのリソースを制限する方法

Local Schedulerノードで利用可能な計算リソースの数の上限を変更することができます(デフォルトの上限はローカルコンピュータのコア数です)。

  • HQueue SchedulerとLocal Schedulerはどちらともジョブで必要な“CPU数/スロット数”(抽象単位)の概念があり、ジョブを同時に実行する際に使用されるマシン上のスロットの最大数を設定します。

  • 例えば、特定のジョブ自体がマルチプロセスまたはマルチスレッドだった場合、4個のコアを使用したいのであれば、そのジョブが4つのスロットを必須とするようにマークすることができます。 Local SchedulerまたはHQueue Schedulerは、最大上限以内で最低でも4つのスロットが“空いている”マシンを確保できた場合にのみそのジョブのスケジュールが組まれます。

  • TOPノードで生成されたジョブで必要なスロット数を指定する:

    1. TOPノードを選択します。

    2. パラメータエディタで、 Schedulers タブをクリックします。

    3. Add Job Parms ボタンを押します。これは、登録されているすべてのスケジューラのメニューを開きます。

    4. Local Scheduler 項目を選択します。

    5. Scheduler Properties ツリーフォルダ内には、オーバーライド可能なプロパティすべてがスケジューラのタイプ別に含まれています。 Local フォルダ下の Slots Per Work Item を選択します。

    6. ボタンを押します。これは、TOPノード上にそれらのプロパティを追加します。

    7. そのウィンドウを閉じてから、 Slots Per Work Item のトグルを有効にして、割り当てたいスロット数を設定します。

    Note

    ワークアイテムアトリビュートに基づいて値を可変させたいのであれば、このパラメータにエクスプレッションを作成すると良いでしょう。

  • Local SchedulerTotal Slots では、クック時に同時にTOPsが使用できる最大スロット数を指定することができます。

  • 同様に、HQueue CPUs per Job では、ジョブが専有する'CPU'スロット数を指定することができます。

(将来のバージョンでは、HQueueと同様にデータベースなどの他のリソースタイプの上限を指定することができる予定です)

視覚的なスケジューリングシステム

この図解では、Houdini TOPネットワークの初期クックからローカルマシンまたはファームでのジョブの実行までの作業の流れを示しています。

緑のボックスでは、ノード、ワークアイテム、ディペンデンシーを管理する PDG Graph Core を表現していますが、何の作業も実行しません。

ピンクのブロックは、ジョブが実際に実行される場所を示し、オレンジの PDG Scheduler Python Binding は、PDGワークアイテムをファームスケジューラジョブに変換し、それらの進捗を監視するシステムです。

PDG MQ RPC Server は、ステータスを多重化し、ジョブからのRPCコールの結果をスケジューラバインディングに返す際に使用可能なプログラムです。 これは、アーティストのマシンとジョブが実行されているマシンとの間のファイアーウォールとネットワークの問題を回避するのに役立ちます。

ワークアイテムのオーバーヘッドを削減する方法

別々のプロセスでオペレーションを開始させるのも、ファーム上でワークのスケジュールを組むのも、ネットワークファイルシステム上にデータを移すのも、どれもこれもTOP内での作業でオーバーヘッド(余計な負荷)が発生します。 一部のノードには、TOPグラフをクックしているプロセス内で小さいジョブを行なうためのオプションがあり、ファーム上でそれらの小さいジョブのスケジュールを組まずに、同じマシン上でそれらのジョブを実行できるようにそれらの小さなワークアイテムをオーバーライドすることができます。

しかし、HDA Processorノードをローカルで実行させた場合でさえも、そのアセットがすぐにクックを完了するようであれば、それを別々のプロセスで実行させるオーバーヘッドは、パフォーマンス全体に影響を与えてしまいます。 このオーバーヘッドを最適化または回避するために、あなたができる事がいくつかあります:

  • HDA Processorノードの代わりにROP Geometryノードを使ってジオメトリを生成し、時間/フレーム番号を使ってWedgeを行なってください。

    同じHIPファイル内に、アセットをTOP Networkとしてインスタンス化して、SOPネットワークのROP Geometryノードを指定します。 そのROP Geometryノードの ROP Fetch タブにある All Frames in One Batch を有効にします。 これによって、1度に1フレームで全フレーム範囲をクックする単一プロセスが作成されます。通常では、これはシミュレーションで使用しますが、軽量なジオメトリのジョブの効率性を上げる際にもよく使用します。

    特定のバッチサイズで試すこともできます。例えば、 All Frames in One Batch の代わりに、1バッチで20フレームを使用するようにすることができます。

  • 可能であれば、HDA Processorノードの代わりにInvokeノードを試してみるのも良いでしょう。Invokeノードは、独自のプロセス内ではなく、TOPグラフをクックしているプロセス内でSOPチェーンをクックします。このInvokeノードの制限事項は、コンパイルブロックでしか使用できないことです。小さい/すぐに処理が終わるようなオペレーションでは、この方が 非常に 効率的です。

  • Local Schedulerを使用する時、サービスを使用することで、HDA ProcessorやROP-Fetchベースの処理を大幅に高速化することができます。

  • ファームを使用する時、ノードのスケジューラオーバーライドをローカルスケジューラに設定してローカルマシン上で小さなジョブを実行する方が効率的な場合があります。他にも、Local Schedulerの Total Slots を上げてみるのもよいでしょう。デフォルトの最大プロセス数はローカルマシンが低速にならないように非常に低く設定(コア数/4)されています。 Total Slots を上げるほど、もっと多くのローカルジョブが並列で実行されます。

See also

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

基本

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

次のステップ

リファレンス

  • すべてのTOPsノード

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

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

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

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

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

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

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

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

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

  • Python API

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

  • Job API

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

  • ユーティリティAPI

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