【OpenCue】オープンソースのレンダリング管理システム OpenCueを試してみる

9 min read読了の目安(約8700字

OpenCueとは?

Google と Imageworks が共同開発した オープンソースのレンダリング管理システムです。

https://www.opencue.io/

この記事でやること

現在OpenCueはLinuxとMacをサポートしており、Windows OSのサポートは試験的だそうです。
実際GithubのIssueにはWindows特有の問題がいくつも報告されており、正式にWindowsをサポートするまでにはもう少し時間がかかりそうな印象です。

今回は、公式のQuick Startsを参考にWindows 10のWSL上のUbuntuを使用して、

  • OpenCueサンドボックス環境のデプロイ
  • OpenCUeクライアントパッケージのインストール
  • ジョブのサブミット、監視
    を行います。

実行環境

  • ホストOS: Windows10
  • WSL2: Ubuntu 20.04
    • Python3.7.10

事前準備

前提条件

Quick Startsには前提条件として以下のソフトウェアをインストールする必要があると書いてあります。

You must have the following software installed on your machine:

  • Python version 2.7 or greater
  • The Python pip command
  • The Python virtualenv tool
  • If you’re using Ubuntu or Debian, the python-dev package
  • If you’re using Fedora or Cent-OS, the python-devel package
  • Docker
  • Docker Compose

CueSubmitをルートユーザーとして実行すると失敗する

OpenCueではクライアントサイドからCueSubmitというGUIを起動して、レンダリングジョブをサーバーに投げます。
Linux,MacOSでは、このCueSubmitをrootユーザーとして実行しているとサブミット実行時に以下のエラーが表示されて失敗してしまします。

サーバー側では以下の様に表示されます。

ERROR grpc-default-executor-8 com.imageworks.spcue.servant.ManageJob - Failed to launch and add job.
cuebot_1  | com.imageworks.spcue.SpecBuilderException: Cannot launch jobs as root.

OpenCueではクライアントからサブミットを実行した際に実行ユーザーのuidを取得して、サーバー上でそのユーザーとしてジョブを実行するという機能を持っており、またルートユーザーとしてジョブを実行することはできないようです。

そのためOpenCueクライアントのインストール、実行はルートユーザ以外で行う必要があるので注意してください。

Python3.7環境の構築 (pyenv, pyenv-virtualenvのインストール)

Quick StartsではPythonのバージョンについて、

  • Python version 2.7 or greater

のみとしか書いてありませんがGithubのIssueでは、Python3.8環境でOpenCueのクライアントパッケージのインストールに失敗すると報告されており、Python3.7を使用することで解決できるようです。

https://github.com/AcademySoftwareFoundation/OpenCue/issues/811

Ubuntu20.04にデフォルトでインストールされているPythonのバージョンは3.8.5なので、pyenvを使用してPython3.7をインストールします。

こちらの記事を参考にpyenv,pyenv-virtualenvをインストールしました。

https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178

pyenvを使用して、Python3.7.10をインストールします

pyenv install 3.7.10

サンドボックス環境の構築・デプロイ

Docker Composeを使用してデプロイします。以下のイメージがDocker Hubからダウンロードされ実行されます。

  • PostgreSQL
  • Cuebotサーバー
  • RQDレンダリングサーバー

1. ソースコードのダウウンロード

公式のGithubレポジトリからソースコードをクローンしてきます。

#作業ディレクトリへ移動
mkdir /rnd/opencue_quickstart && cd /rnd/opencue_quickstart

git clone https://github.com/AcademySoftwareFoundation/OpenCue.git

レポジトリのルートへ移動します

cd OpenCue

2. Dockerボリュームのマウント先ディレクトリの作成

公式のDocker Composeの設定では、RQDコンテナのログディレクトリとショットディレクトリをホストOS上のディレクトリにマウントしています。

マウント先のディレクトリを作成し、権限を設定します。

mkdir -p /tmp/rqd/logs /tmp/rqd/shots
chmod -R 777 /tmp/rqd

3.Docker Composeの実行

docker-composeコマンドを実行する前にいくつか環境変数を設定します。この値はdocker-compose.yml上で定義されていてデプロイを実行したときに各コンテナに渡される値です。

export CUE_FRAME_LOG_DIR=/tmp/rqd/logs

#Postgresデータベースのパスワード
export POSTGRES_PASSWORD=<REPLACE-WITH-A-PASSWORD>

サンドボックス環境をデプロイします

docker-compose --project-directory . -f sandbox/docker-compose.yml up

無事セットアップが完了すると以下のようなログが流れます。(なぜこのメッセージがWARNINGなのかは謎)

rqd_1     | WARNING:root:RQD Starting Up
rqd_1     | WARNING:root:RQD Started
cuebot_1  | 2021-03-20 08:26:33,883 WARN pool-1-thread-1 com.imageworks.spcue.dispatcher.HostReportHandler - Unable to find host 172.21.0.5,org.springframework.dao.EmptyResultDataAccessException: Failed to find host 172.21.0.5 , creating host.

自分の環境では以下のようなワーニングが流れました。GRPCの接続に失敗しているようですがこの後にRQD Startedのログが表示されていたので、問題はないようです。

rqd_1     | WARNING:root:GRPC connection failed. Retrying in 15 seconds

OpenCueクライアントのインストール

OpenCueクライアントをインストールすることでレンダリングジョブのサブミット、監視、管理ができるようになります。
OpenCueクライアントは以下のパッケージに分かれています。

  • PyCue
  • PyOutline
  • CueSubmit
  • CueGUI
  • cueadmin
  • pycuerun

クライアントパッケージはGithubのリリースからインストールする方法と、ローカルにクローンしたレポジトリのソースコードからインストールをする2つの方法があります。

ローカルのソースコードからインストール場合は公式ドキュメントで説明されている以下の点について注意してください。

Note
Alternatively, you can install the client packages from your local clone of the source code. However, the latest version of the OpenCue source code might include changes that are incompatible with the prebuilt OpenCue images of Cuebot and RQD on Docker Hub used in the sandbox environment. To install from source, run sandbox/install-client-sources.sh.

ここではGithubのリリースからインストールします。
以下の手順でインストールを行います。

  1. 仮想環境の作成、起動
    クローンしたOpenCueレポジトリのルートへ移動します。

    cd OpenCue
    

    pyenv-virtualenvを使用して仮想環境を作成します

    pyenv virtualenv 3.7.10 opencue_client
    
  2. インストールスクリプトの実行
    環境変数でインストールするクライアントパッケージのバージョンを指定します。
    GitHub上のOpenCueのリリースからインストールするバージョンを選択してください。

    現在の最新バージョンである0.8.8をインストールします。

    export VERSION=0.8.8
    

    インストールスクリプトを実行してクライアントパッケージとその依存パッケージをインストールします。

    sandbox/install-client-archives.sh
    

サンドボックス環境に接続する

インストールしたOpenCueクライアントから、Docker Composeでデプロイしたサンドボックス環境に接続してみます。

  1. OpenCueクライアントの設定
    サーバーに接続するためには、環境変数を通してクライアントに以下の情報を設定する必要があります。

    • ジョブの仕様を定義するPyOutline設定ファイルoutline.cfgのパス
    • 接続するCueBotサーバーのドメイン名

    PyOutline設定ファイルのパスを指定します。クローンしたGitレポジトリ内にデフォルトの設定が用意されています

    export OL_CONFIG=pyoutline/etc/outline.cfg
    

    Docker ComposeでデプロイしたCueBotのコンテナはgRPCのポートをホストOSのlocalhostにバインドしています。これはdocker psコマンドで確認できます。

    export CUEBOT_HOSTS=localhost
    
  2. 接続の確認
    サンドボックス環境・クライアントパッケージがそれぞれ正しく動作しているか確認するために、cueadminコマンドを実行します。以下のコマンドのCueBotサーバーの一覧を表示できます。

    cueadmin -lh
    

    以下のような結果が出力されます。

    Host            Load NIMBY freeMem  freeSwap freeMcp   Cores Mem   Idle             Os       Uptime   State  Locked    Alloc      Thread
    172.23.0.4      4    False 12.7G    4.0G     225.9G    6.0   15.5G [ 6.00 / 15.5G ] Linux    00:10    UP     OPEN      local.general AUTO
    

WSL2上でGUIを使うための設定

WSL2上でGUIアプリを実行するためには少し設定が必要です。

以下の記事を参考にしました。

https://qiita.com/momomo_rimoto/items/51d533ae9529872696ce

Windows側の設定

  1. X Serverのインストール
    https://sourceforge.net/projects/vcxsrv/ からVcXsrvをダウンロードします。インストーラーを実行してインストールしてください。
  2. X Serverの起動
    StartUpメニューにX Launchが追加されているので起動して設定を行います。
    • Select display settings: Multiple Windows
    • Select how to start clients: Start no client
    • Extra settings: Addtional parameters for VcXsrvに -acと入力する
  3. ファイアウォールの設定
    • Windowsのコントロールパネルを開きます
    • システムとセキュリティ>Windows Defender ファイアウォールを表示します
    • 詳細設定を開きます
    • Windows Defenderファイアウォールのプロパティを開きます
    • パブリックプロファイル>保護されているネットワーク接続:カスタマイズ を開きます
    • vEthernet(WSL)のチェックを外します

Ubuntu側でのGUI環境のセットアップ

  1. グラフィック関係のパッケージをインストールします。
 sudo apt install libgl1-mesa-dev xorg-dev
  1. DISPLAY変数の設定
    Ubuntuで実行したGUIアプリをWindows上のX Serverで出力させるためにDISPLAY変数の設定を行います。
echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0' >> ~.bashrc

自分の環境では加えて以下の設定をする必要がありました。
※OpenGLのバージョンによってLIBGL_ALWAYS_INDIRECT変数の設定方法が異なるようです。

echo `export LIBGL_ALWAYS_INDIRECT=1` >> ~.bashrc

GUIアプリが動作することを確認する

ここまでのセットアップでGUIアプリが動作するはずです。セットアップが問題ないか確認します。
以下のコマンドを実行します

#パッケージのインストール
sudo apt install x11-apps

#起動
xeyes

Windows上でGUIが表示されることを確認します。

OpenCue GUIクライアントの起動

CueSubmitアプリの起動

cuesubmit &

GUIが起動します

サブミットの実行

デフォルトでは、サンドボックス環境はレンダリングソフトウェアを含んでいません。
実際にレンダリングジョブを走らせるためには、サーバー側でMayaやBlenderなどのレンダリングが実行できる環境をセットアップする必要があるみたいです。
ここでは代わりに簡単なシェルスクリプトを実行して、サブミットのフローを確認します。

起動したGUI上に以下のように入力します。

  • Job Name: HelloWorld
  • User Name: test-user
  • Shot: test-shot
  • Layer Name: test-layer
  • Command To Run:
    echo "Output from frame: #IFRAME#; layer: #LAYER#; job: #JOB#"
    
  • Frame Spec: 1-10

Submitボタンをクリックして、サブミットを実行します。

ジョブの監視

サブミットしたジョブを監視するために、CueGUI Cuetopiaアプリを起動します。

cuegui &

CuetopiaとCueCommanderの2つのGUIが起動します。一旦CueCommanderは無視して進めます。

Jobビューから先程作成したジョブを選択するとジョブ内のフレームの一覧が表示されます。(今回はフレームを1-10に指定したため10個のフレームが表示されます)

Logビューでは、レンダージョブがフレーム毎に出力したログを表示します。

ここではサブミット時に指定したシェルスクリプトの出力も表示されます。以下のように表示されているはずです。

Output from frame: 2; layer: test_layer; job: testing-test_shot-hsuzuki_helloworld

まとめ

ここまででとりあえずWSL上でサンドボックス環境を構築することができました。

ここからさらに、

  • WindowsOS上でOpenCueクライアントをインストールする
  • Blenderのレンダリングジョブのサブミット
  • 本番環境のセットアップ

など試していきたいと思います。