🚜

Deadline Scripting 備忘録

に公開

AWS Thinkbox Deadline のスクリプト拡張についてメモです。
AWS Deadline Cloudとは違います。

Deadlineとは?

Frantic Films(カナダ)のR&D部門が開発していたレンダーファーム管理ツールです。もともと内製ツールでしたが2004年に商用化、2007年にPrime Focusによって買収、2010年にFrantic Films創業者のクリス・ボンド氏(linkedin)がThinkbox Softwareを創業して買い戻し、さらに2017年にはAWSに買収されました。

https://www.fxguide.com/quicktakes/aws-thinkbox-deadline-a-brief-history/

2022年に無償化、2024年にクラウド版である AWS Deadline Cloud が発表されました。以後、オンプレにインストールしてレンダーファームを管理する無償版の方が「AWS Thinkbox Deadline」、フルマネージドなクラウドレンダーファームサービスが「AWS Deadline Cloud」となりました。

Deadline Cloudは新規ツール、Thinkbox Deadlineは現在バージョン10です。
本稿はThinkbox DeadlineのリポジトリをPythonで拡張する際のメモです。

公式ドキュメント

現在のlatestは10.4.2.2です

Scripting Overview
https://docs.thinkboxsoftware.com/products/deadline/latest/1_User Manual/manual/scripting-overview.html

Deadline Scripting Reference
https://docs.thinkboxsoftware.com/products/deadline/latest/2_Scripting Reference/namespace_frantic_x.html

GitHub
https://github.com/ThinkboxSoftware/Deadline

Customフォルダ

Deadlineをインストールしたらリポジトリ内のPythonファイルを拡張していきます。
ここで注意なのが、eventsフォルダ、pluginsフォルダなどのなかみを直接編集しないということです。

それらをカスタマイズしようとなったら、まず「Custom」というフォルダを新たに設置して、そこにpluginsやeventsなど同じ階層を作ってPythonファイルを設置(コピー)して、それを編集していきましょう。
Customフォルダが設置されている場合、その中に同名のプラグインやイベントが見つかった場合はDeadlineはそちらを優先的に動作させます。Custom以下のファイルを削除すれば元の動作に戻るという具合です。

スクリプトをカスタマイズしていく場合は、もともと設置されているファイルは触らず、Customフォルダ以下で作業するようにしましょう。

https://docs.thinkboxsoftware.com/products/deadline/latest/1_User Manual/manual/scripting-overview.html#custom-repository-folder

optional script (JobPreLoadなど)

プラグインの同階層に特定の名前のファイルを設置しておくと、所定の動作の前に処理を追加できます。

  • JobPreLoad.py
  • PluginPreLoad.py
  • GlobalJobPreLoad.py
  • GlobalPluginPreLoad.py

PreばかりでPostがありませんが、ジョブにはPre・Postともにスクリプト実行できるパラメータがあります。
↓Post Scriptの例
https://github.com/ThinkboxSoftware/Deadline/blob/master/Examples/PostJob/Image Renamer/Renamer.py

JobPreLoad の例

deadlinePluginを引数として受け取る __main__ 関数を記述しておくと、その中身がジョブが走る前に実行されます。ジョブの準備をするのによく使います。

上記ドキュメントに書かれているサンプルスクリプトは下記です。(抜粋)

#!/usr/bin/env python3
from System import *
from System.IO import *

def __main__(deadlinePlugin):
    job = deadlinePlugin.GetJob()
    deadlinePlugin.LogInfo("JobName: %s" % job.JobName)
    deadlinePlugin.LogInfo("JobId: %s" % job.JobId)

    deadlinePlugin.LogInfo("Copying some files")
    # 中略
    deadlinePlugin.SetProcessEnvironmentVariable("EnvVar1", "True")
    # 後略

プラグインオブジェクト

JobPreLoad実装時は、引数として受け取れるので取得については特に工夫はいりません。

https://docs.thinkboxsoftware.com/products/deadline/latest/2_Scripting Reference/class_deadline_1_1_plugins_1_1_deadline_plugin.html

ジョブオブジェクト

GetJobメソッドで取得できます。

job = deadlinePlugin.GetJob()

https://docs.thinkboxsoftware.com/products/deadline/latest/2_Scripting Reference/class_deadline_1_1_jobs_1_1_job.html

GetJobEnvironmentKeyValue でジョブに記入された環境変数を取得できます。
SetJobEnvironmentKeyValue で記入できます。

タスクオブジェクト

GetCurrentTaskメソッドで取得できます。

task = deadlinePlugin.GetCurrentTask()

https://docs.thinkboxsoftware.com/products/deadline/latest/2_Scripting Reference/class_deadline_1_1_jobs_1_1_task.html

レンダリング終了後の各種数値を計算する

stats = JobUtils.CalculateJobStatistics(job, tasks)

イベントプラグインのJobStatsに書かれています。(Custom/events/JobStats/JobStats.py)

https://github.com/ThinkboxSoftware/Deadline/blob/master/Custom/events/JobStats/JobStats.py

RepositoryUtils 関連

投げ直し(Requeue)

何か条件に引っ掛かったらやり直して欲しい場合があります。そのまま進んだらエラーになってしまうけどエラーを溜めるのも気持ちが悪い(エラーカウントもたまる)など。

RepositoryUtilsのRequeueJob、RequeueTasksが使えます。

from Deadline.Scripting import RepositoryUtils

RepositoryUtils.RequeueJob(job)

Jobをセーブ

jobオブジェクトの値を変更する際は、set系メソッドで値をセットした後にジョブをセーブする必要があります。

job.SetJobLimitGroups(limitNames)    # ジョブのリミットグループを変更
RepositoryUtils.SaveJob(job)    # 保存

これを忘れると、変更が反映(保持)される場合もあれば変更されないままになる場合もあったりと、つかみづらい挙動になります。

このあたりのサンプルとしてSetJobLimit.pyイベントが参考になります。
https://github.com/ThinkboxSoftware/Deadline/blob/master/Custom/events/SetJobLimit/SetJobLimit.py

イベントプラグイン

DeadlineEventListener を継承することでイベントプラグインを作ることができます。

from Deadline.Events import DeadlineEventListener

class SampleListener (DeadlineEventListener):
    ...
  • OnJobSubmitted
  • OnJobFinished
  • OnJobFailed

などのイベントがあります。
サンプルとしては下記のプラグインがありますが、
https://github.com/ThinkboxSoftware/Deadline/blob/master/Custom/events/Sample/Sample.py
イベントはもっとたくさんあります。
↓ドキュメントを確認しつついろいろ考えてみてください。
https://docs.thinkboxsoftware.com/products/deadline/latest/1_User Manual/manual/event-plugins.html#triggering-events

Monitor Script

Deadline Monitor自体を拡張して、メインメニューやコンテキストメニューに項目を追加できます。

https://docs.thinkboxsoftware.com/products/deadline/latest/1_User Manual/manual/monitor-scripts.html#general-scripts-ref-label

Monitorで選択中のジョブを一括Requeueする例
https://github.com/ThinkboxSoftware/Deadline/blob/master/Custom/scripts/Jobs/RequeueCompleteJob.py

おわり

このようにDaedlineのジョブまわりやDeadline Monitorなどかなりの部分をPythonでカスタマイズできます。
自由度高くパイプラインに組み込むことができるのも、レンダーファーム管理ツールとして随一の人気を得ている理由かと思われます。

Discussion