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に買収されました。
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
Deadline Scripting Reference
GitHub
Customフォルダ
Deadlineをインストールしたらリポジトリ内のPythonファイルを拡張していきます。
ここで注意なのが、eventsフォルダ、pluginsフォルダなどのなかみを直接編集しないということです。
それらをカスタマイズしようとなったら、まず「Custom」というフォルダを新たに設置して、そこにpluginsやeventsなど同じ階層を作ってPythonファイルを設置(コピー)して、それを編集していきましょう。
Customフォルダが設置されている場合、その中に同名のプラグインやイベントが見つかった場合はDeadlineはそちらを優先的に動作させます。Custom以下のファイルを削除すれば元の動作に戻るという具合です。
スクリプトをカスタマイズしていく場合は、もともと設置されているファイルは触らず、Customフォルダ以下で作業するようにしましょう。
optional script (JobPreLoadなど)
プラグインの同階層に特定の名前のファイルを設置しておくと、所定の動作の前に処理を追加できます。
- JobPreLoad.py
- PluginPreLoad.py
- GlobalJobPreLoad.py
- GlobalPluginPreLoad.py
PreばかりでPostがありませんが、ジョブにはPre・Postともにスクリプト実行できるパラメータがあります。
↓Post Scriptの例
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実装時は、引数として受け取れるので取得については特に工夫はいりません。
ジョブオブジェクト
GetJobメソッドで取得できます。
job = deadlinePlugin.GetJob()
GetJobEnvironmentKeyValue でジョブに記入された環境変数を取得できます。
SetJobEnvironmentKeyValue で記入できます。
タスクオブジェクト
GetCurrentTaskメソッドで取得できます。
task = deadlinePlugin.GetCurrentTask()
レンダリング終了後の各種数値を計算する
stats = JobUtils.CalculateJobStatistics(job, tasks)
イベントプラグインのJobStatsに書かれています。(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イベントが参考になります。
イベントプラグイン
DeadlineEventListener を継承することでイベントプラグインを作ることができます。
from Deadline.Events import DeadlineEventListener
class SampleListener (DeadlineEventListener):
...
- OnJobSubmitted
- OnJobFinished
- OnJobFailed
などのイベントがあります。
サンプルとしては下記のプラグインがありますが、
イベントはもっとたくさんあります。
↓ドキュメントを確認しつついろいろ考えてみてください。
Monitor Script
Deadline Monitor自体を拡張して、メインメニューやコンテキストメニューに項目を追加できます。
Monitorで選択中のジョブを一括Requeueする例
おわり
このようにDaedlineのジョブまわりやDeadline Monitorなどかなりの部分をPythonでカスタマイズできます。
自由度高くパイプラインに組み込むことができるのも、レンダーファーム管理ツールとして随一の人気を得ている理由かと思われます。
Discussion