Amazon Web Services ブログ

AWS Deadline Cloud 用の conda パッケージとチャネルの作成

AWS Deadline Cloud は、Amazon Web Services (AWS) から提供されるフルマネージドサービスで、スケーラブルなフルマネージドのビジュアルコンピューティングファームを数分で起動できます。Blender、Houdini、Maya、Nuke などのデジタルコンテンツ制作 (DCC) アプリケーションのレンダリングジョブは、Deadline Cloud Service-Managed Fleets (SMF) を使用することで、迅速かつターンキーで実行できます。これらのアプリケーションは、SMF 環境のワーカー用に conda パッケージ としてサービスに含まれています。しかし、異なるバージョンの DCC を実行したり、サードパーティ製のプラグインを使用したり、パイプラインコードをカスタマイズしている場合はどうすればよいでしょうか。

このブログ記事では、独自の conda パッケージを作成し、Amazon S3 バケットに conda チャネルをホストして、そのパッケージを Deadline Cloud のレンダーワーカーが利用できるようにする方法を説明します。アプリケーション全体をバンドルして依存関係なく実行可能なパッケージを作成したり、conda-forge コミュニティによって維持・ホストされている数千のパッケージを元に作成することができます。カスタム conda パッケージとチャネルを利用できるので、Deadline Cloud のパイプラインを拡張し、事実上あらゆるクリエイティブ ツールをサポートすることができます。

このブログ記事の手順に従って、公式のアップストリームバイナリビルドから Blender 4.1 conda パッケージをビルドするために Deadline Cloud キューを使用し、新しいカスタム conda チャネルを使って Blender 4.1 を見つけるようにプロダクションキューを構成し、ファームで Blender のデモシーンをレンダリングします。

パッケージビルドのアーキテクチャ

図 1: 本記事で作成するパッケージビルドキューと通常 Deadline Cloud レンダリングジョブが実行されるプロダクションキューの関係を示しています。

このブログ記事で展開されるアーキテクチャは、conda パッケージビルドジョブ専用の新しいパッケージビルドキューをファームに追加します。

このアーキテクチャの主な特徴は次のとおりです:

  • プロダクションキューは、S3 バケットの /Conda プレフィックスに対する読み取り権を持つため、カスタムの conda パッケージを使用することはできますが、変更することはできません。
  • パッケージビルドキューは、S3 バケットの /Conda プレフィックスに対する読み取り/書き込み権を持つため、新しくビルドされたパッケージをアップロードし、conda チャネルのインデックスを再作成することができます。
  • パッケージビルドキューは、S3 バケット内に別のジョブアタッチメントプレフィックスを持つため、そのデータはプロダクションデータから分離されています。
  • パッケージビルドジョブは、プロダクションキュー用に既に作成したフリートを使用するため、管理が必要な個別のインフラストラクチャコンポーネントの数を減らすことができます。

前提条件

このチュートリアルでは、以下が条件を満たしている必要があります。

  • AWS アカウントを持っていること
  • Git がインストールされていること
  • AWS Deadline Cloud 用に Deadline Cloud CLI がインストールされていること
  • Deadline Cloud が AWS アカウントにセットアップされており、少なくとも 1 つのキューとフリートがあること

カスタム conda パッケージ用のキューの権限設定

conda パッケージをローカルでビルドすることはできますが、このブログ記事では AWS Deadline Cloud でパッケージをビルドします。これにより、完成したパッケージを conda チャネルとして使用する Amazon S3 バケットに簡単に配信でき、自身のコンピューティングリソースでのビルドに必要な依存関係を減らすことができ、コンピュータをビルドプロセスで拘束することなく複数のパッケージをビルドできます。

AWS Deadline Cloud のカスタム conda チャネルには、Amazon S3 バケットが必要です。新しいバケットを作成するか、既存のキューの 1 つから S3 バケットを再利用できます。Deadline Cloud の目的のキューのキュー詳細ページのジョブアタッチメントファイルタブで、キューの S3 バケット情報を確認できます。

図2: “default-queue-s3-bucket” という名前のジョブアタッチメントバケットを持つ “Production Queue” のキュー詳細ページの例。 

ジョブアタッチメントファイルタブには、現在設定されているバケットが表示されます。また、ジョブアタッチメントバケットの上にある “Awsdeadlinecloudqueuerole” というキューサービスロールにも注目してください。バケット名とキューのロール名は異なります。

プロダクションキューを設定するには、キューの詳細ページにあるバケット名とキューサービスロールの両方が必要です。ゴールは、プロダクションキューに S3 バケットの新しい /Conda プレフィックスへの読み取り権を与え、パッケージビルドキューには読み取り/書き込み権を与えることです。ロールのアクセス権を編集するには、このページのキューサービスロールをクリックします。これにより、そのロールの AWS Identity and Access Management (IAM) ページに直接移動します。

キューサービスロールを表示するときは、[+] を選択してポリシー名が AWSDeadlineCloudQueuePolicy で始まるポリシーを展開し、[編集] を選択してください。

デフォルトでは、このキューロールは、最小権限の原則に従い、AWS アカウント内の特定のリソースへのアクセスのみに制限されているため、権限は限られた数しか表示されません。ビジュアルエディタまたは JSON エディタを使用して、次の例のような新しいセクションを追加できます。オレンジ色で強調されているバケット名とアカウント番号は、ご自身のものに置き換えてください。ポリシーへの新しい追加は、バケットと新しい /Conda プレフィックスの両方に対して、s3:GetObject と s3:ListBucket の権限を許可する必要があります。

		{
			"Effect": "Allow",
			"Sid": "CustomCondaChannelReadOnly",
			"Action": [ 
				"s3:GetObject",
				"s3:ListBucket"
			 ],
			"Resource": [ 
				"arn:aws:s3:::default-queue-s3-bucket",
				"arn:aws:s3:::default-queue-s3-bucket/Conda/*"
			 ],
			"Condition": {
				"StringEquals": {
					"aws:ResourceAccount": "111122223333"
				}
			}
		},

パッケージビルドキューの作成

次に、conda チャネル用の特定の conda パッケージをビルドするジョブを送信する、新しいパッケージビルドキューを作成します。Deadline Cloud コンソールのファームページから、キューの作成を選択します。

S3 バケットは、プロダクションキューと同じバケットを使用するか、新しいバケットを作成します。通常の Deadline Cloud のジョブアタッチメントファイルとは別に保管するため、/DeadlineCloudPackageBuild などの新しいプレフィックスを作成することをお勧めします。フリートの関連付けについては、既存のフリートを使用することもできますし、現在のフリートが適さない場合は、完全に新しいフリートを作成することもできます。

キューサービスロールについては、新しいキューサービスロールを作成して使用することをお勧めします。このロールを設定すると、指定した S3 バケットとプレフィックスに対する読み取り/書き込み権が自動的に付与されます。

パッケージビルドキューの権限設定

先程プロダクションキューのロールを変更したのと同様に、パッケージビルドキューのロールを変更して、/Conda プレフィックスへの読み取り/書き込み権を与える必要があります。

パッケージビルドキューの詳細ページから、キューサービスロールをクリックし、[+]をクリックしてから [編集] をクリックします。この一連の権限は読み取り/書き込みする必要があるため、ポリシーの追加には、デフォルトのキュー宛先で使用される 4 つの権限 (s3:GetObject、s3:PutObject、s3:ListBucket、s3:GetBucketLocation) に加えて、s3:DeleteObject によるオブジェクトの削除機能が含まれています。これらの権限は、パッケージビルドジョブが新しいパッケージをアップロードしてチャネルをインデックスを再作成するために必要です。オレンジ色で強調表示されているバケット名とアカウント番号は、ご自身のものに置き換えてください。

		{
			"Effect": "Allow",
			"Sid": "CustomCondaChannelReadWrite",
			"Action": [ 
				"s3:GetObject",
				"s3:PutObject",
				"s3:DeleteObject",
				"s3:ListBucket",
				"s3:GetBucketLocation"
			 ],
			"Resource": [ 
				"arn:aws:s3:::default-queue-s3-bucket",
				"arn:aws:s3:::default-queue-s3-bucket/Conda/*"			 ],
			"Condition": {
				"StringEquals": {
					"aws:ResourceAccount": "111122223333"
				}
			}
		},

Blender 4.1 パッケージのビルド

以下の手順では、bash 互換のシェルから git を 使用して、Deadline Cloud Samples GitHub からOpen Job Description (OpenJD) パッケージのビルドジョブと、 conda レシピを取得します。Windows の git インストールには、git BASH と呼ばれる bash のバージョンが含まれており、これを使用できます。また、Deadline Cloud CLI をインストールし、Deadline Cloud monitor にログインするか、別の AWS 認証方式を使用する必要があります。最後のステップは、Deadline Cloud CLI を使用してそれらの OpenJD ジョブバンドルをキューに送信することです。

bash 互換のシェルで deadline config gui を実行し、構成 GUI を開いて、デフォルトのファームとキューを作成したパッケージビルドキューに設定してください。

git clone で Deadline Cloud サンプル GitHub リポジトリをクローンし、conda_recipes ディレクトリに切り替えると、submit-package-job というスクリプトが見つかります。このスクリプトを初めて実行すると、次の例のように Blender をダウンロードする手順が表示されます。手順に従ってダウンロードが完了したら、ジョブを再度実行してサブミッションを作成してください。

$> deadline config gui 
$> git clone https://github.com/aws-deadline/deadline-cloud-samples.git 
$> cd deadline-cloud-samples/conda_recipes 
$> ./submit-package-job --recipe blender-4.1/
 No S3 channel provided, using job attachments bucket default                                                                                                     
 ERROR: File blender-4.1/blender-4.1.1-linux-x64.tar.xz not found.                                                                                                
 To submit the blender-4.1 package build, you need the archive blender-4.1.1-linux-x64.tar.xz                                                                     
 To acquire this archive, follow these instructions...
$> ./submit-package-job --recipe blender-4.1/
 No S3 channel provided, using job attachments bucket default                                                                                                     
 Building package into conda channel s3://default-queue-s3-bucket/Conda/Default 
 
+ deadline bundle submit build_linux_package -p RecipeName=blender-4.1 -p OverrideSourceArchive=blender-4.1/blender-4.1.1-linux-x64.tar.xz -p RecipeDir=blender-4 
.1/blender-4.1 -p 'S3CondaChannel=s3://default-queue-s3-bucket/Conda/Default' -p CondaChannels=                                               
 Submitting to Queue: Package Build Queue                                                                                                                         
...
 Job creation completed successfully                                                                                                                              

Deadline Cloud monitor を使用して、ジョブの実行中の進行状況とステータスを確認します。デフォルトの 2 vCPU、8 GiB RAM のインスタンスサイズ仕様では、パッケージのビルド、S3 バケットへのアップロード、チャネルの再インデックスに 22 分かかりました。デフォルトのフリート設定は conda パッケージのビルドとレンダリングには比較的小さいため、設定を増やすことをお勧めします。

図3. パッケージビルドジョブがハイライトされた Deadline Cloud monitor

Deadline Cloud monitor の左下には、ジョブの 2 つのステップ (パッケージのビルドとインデックスの再作成) が表示されています。右下には、各ステップの個々のタスクが表示されています。この例では、各ステップに 1 つのだけタスクがあります。

パッケージビルドのステップのタスクを右クリックし、[ログを表示] を選択します。右側に、セッション操作のリストが表示され、ワーカーホストでタスクがどのようにスケジュールされるかを示すます。セッション操作は次のとおりです。

  1. アタッチメントファイルの同期 : この操作は、ジョブのアタッチメントファイルシステムの設定に応じて、入力ジョブのアタッチメントファイルデータをコピーするか、仮想ファイルシステムをマウントします。
  2. Conda の起動 : この操作は、Deadline Cloud コンソールのオンボーディングフローがデフォルトで追加する OpenJD キュー環境 のものです。ジョブは conda パッケージを指定しないため、すぐに終了し、conda 仮想環境は作成されません。
  3. CondaBuild 環境の起動 : この操作は、conda パッケージのビルドと conda チャネルのインデックスの再作成に必要なソフトウェアを含む、カスタマイズされた conda 仮想環境を作成します。conda-forge チャネルからインストールします。
  4. タスクの実行 : この操作は、Blender パッケージのビルドを実行し、作成されたパッケージを S3 にアップロードします。

図 4. Deadline Cloud monitor のログビューアー

ログは構造化された形式で Amazon Cloudwatch 内に保存されています。ジョブが完了した後、「すべてのタスクのログを表示」をチェックすると、ジョブが実行された環境のセットアップとティアダウンに関する追加のログを表示できます。

パッケージビルドジョブがどのように実装されているのか気になる方は、ソースコードをご確認ください。たとえば、チャネルのインデックスを再作成するステップには、一度に 1 つのパッケージビルドジョブのみがインデックスの再作成を実行できるようにする相互排他があります。これは OpenJD 環境として実装されており、Amazon S3 の強い整合性を使用して、追加のインフラストラクチャを必要とせずに正しい実装されています。

プロダクションキュー環境にconda チャネルを追加

S3 conda チャネルと Blender 4.1 パッケージを使用するには、Deadline Cloud に送信するジョブの CondaChannels パラメータに s3:///Conda/Default チャネル場所を追加する必要があります。構築済みの Deadline Cloud サブミッターには、カスタム conda チャネルと conda パッケージを指定できるフィールドが用意されています。

プロダクションキューの conda キュー環境を少し変更するだけで、すべてのジョブを変更する必要がなくなります。Deadline Cloud コンソールを開き、プロダクションキューのキュー環境タブに移動します。リストの「Conda」キュー環境のチェックボックスを有効にし、[編集] を選択します。Costomer-Managed Fleet の場合は、Deadline Cloud samples GitHub にある conda キュー環境サンプルのいずれかを使用して conda パッケージの使用を有効にできます。

CondaChannels パラメータを指定するセクションに、デフォルト値を以下のように設定する行があります:

default: "deadline-cloud"

この行を編集して、新しく作成した S3 conda チャネルで始めます:

default: "s3:///Conda/Default deadline-cloud"

Service-Managed Fleets では、デフォルトで conda のstrict channel priorityが有効になっているため、S3 チャネルに blender をビルドすると、conda は deadline-cloud チャネルを全く考慮しなくなります。つまり、以前は deadline-cloud チャネルを使用して成功していた blender=3.6 を含むジョブが、Blender 4.1 をビルドした後は失敗するようになります。

Blender 4.1 ジョブをプロダクションキューに送信

パッケージがビルドされ、キューがそのチャネルを使用するように設定されたので、いよいよパッケージを使用してレンダリングします。まず、CLI コマンドの deadline config gui を再度実行し、プロダクションキューを選択して、プロダクションキューに切り替えてください。

まだ Blender のシーンを持っていない場合は、Blender のデモファイルページに移動し、ダウンロードするファイルを選択します。私たちは、Blender Splash Artwork セクションにある Nicole Morena 氏が作成し、CC-BY-SA ライセンスの下でリリースされた Blender 3.5 – Cozy Kitchen シーンファイルを選択しました。ダウンロードすると blender-3.5-splash.blend というファイルが含まれており、クイックスタートのオンボーディングフリートでも簡単にレンダリングできます。他のシーンをレンダリングする場合は、Deadline Cloud コンソールからフリート設定値を増やす必要があるかもしれません。

Deadline Cloud samples GitHub リポジトリには、次のコマンドを使用して Blender シーンをレンダリングできるサンプルジョブが含まれています。

$> deadline bundle submit blender_render \ 
     -p CondaPackages=blender=4.1 \ 
     -p BlenderSceneFile=/path/to/downloaded/blender-3.5-splash.blend \ 
     -p Frames=1 
 Submitting to Queue: Production Queue 
...
 Job creation completed successfully 

Deadline Cloud monitor で、送信したジョブのタスクを選択し、ログを表示するオプションを選択します。ログビューの右側で、「Launch Conda」と呼ばれるセッションアクションを選択します。キューの環境で設定された 2 つの conda チャネルで Blender 4.1 を検索し、S3 チャネルでパッケージを見つかったことがわかります。

ジョブが完了したら、出力をダウンロードして結果を確認できます。

クリーンアップ

  1. キューからフリートの関連付けを解除したあと、キューを削除してください。
  2. /Condaプレフィックスを削除するには、AWS コンソールで S3 バケットに移動し、バケットを開き、/Condaプレフィックスを選択し、「削除」を選択して、指示に従ってください。
  3. OS の通常の削除手順を実行して、ダウンロードしたファイルや git クローンしたファイルを削除してください。
  4. IAM ポリシーに追加した権限を削除するには、前述の手順に従って各ポリシーに移動し、追加したセクションを削除してください。

まとめ

このブログ記事では、キューロールのアクセス権を変更する方法、新しいバージョンのソフトウェア用にカスタム conda パッケージをビルドする方法、プロダクションレンダーキュー用の conda チャネルとして機能する S3 バケットを追加する方法を説明しました。Open Job Description と AWS Deadline Cloud は、さまざまな計算ジョブ、およびレンダリングジョブを処理できるように設計されており、組み込みの SMF サポートと私たちが提供するビルド済みのサブミッターをはるかに超えてパイプラインを拡張できます。提供されている例を参考に、小さなプラグインや Nuke gizmoなどの簡単なものから始めて、今日からあなたの Deadline Cloud ファームの機能をカスタマイズしてみてください。

著者について

Mark Wiebe

Mark Wiebe

Mark Wiebe is a Principal Engineer at AWS Thinkbox, focused on solutions for creative content.

Sean Wallitsch

Sean Wallitsch

Sean is a Senior Solutions Architect, Visual Computing at AWS.

参考リンク

AWS Media Services
AWS Media & Entertainment Blog (日本語)
AWS Media & Entertainment Blog (英語)
AWS のメディアチームの問い合わせ先: awsmedia@amazon.co.jp
※ 毎月のメルマガをはじめました。最新のニュースやイベント情報を発信していきます。購読希望は上記宛先にご連絡ください。

翻訳はソリューションアーキテクトの濵野が担当しました。原文はこちらです。