使用 OpenCue 在 GCP 中创建渲染农场

机器人舞会

本教程介绍如何使用 Google Cloud 在 Linux 虚拟机 (VM) 上部署 OpenCue 渲染管理系统。学完整个教程需要 3–4 小时。

渲染管理工具用于视觉效果和动画制作领域,可将复杂的作业分解为一个个任务,并将这些流程分配到各种计算资源中。这些工具不仅用于管理各种作业,例如 3D 渲染、2D 合成、将数据从一种格式转码到另一种格式,以及将资源存入数据库或从中提取出来,还经常用于关联作业暂存区和依赖项。在较大的设施中,渲染管理系统可以支持数千个并发作业,并提供用于为作业的每个阶段分配资源、管理日志、对工具进行问题排查和管理资源的界面。

Google 与 Sony Pictures Imageworks 联合发布了 OpenCue,这是一款经过生产环境验证的开源渲染管理系统,可在 Linux 和 macOS 上运行。利用来自多家云服务提供商的资源,OpenCue 已被用于构建本地渲染农场以及进行大规模的混合部署。

本教程适用于熟悉以下工具和概念的 IT 管理员及流水线技术主管。即使您不熟悉此列表中的内容也不必担心,我们会在适用的地方指明其他资源。

  • 分布式渲染管理的操作原理。
  • Git 和 GitHub。
  • 用于创建和运行容器的 Docker。
  • 用于修改脚本和运行资源的 Bash 脚本。
  • Python 配置和脚本修改。
  • Google Cloud 资源管理基本工具和概念,包括 Cloud SQL、Compute Engine、Cloud Storage 和 Container Registry。

由于渲染管理工具涵盖各种用例并编排了大量资源,因此有许多方法可以配置渲染农场。 本教程重点介绍一种配置方法,帮助您尽快了解并开始运用 OpenCue。为渲染农场创建更优化的架构可能需要修改步骤、分析工作流的性能或更换 Google Cloud 资源的类型。如需详细了解在 Google Cloud 上设置和管理渲染农场的选项,请参阅构建混合渲染农场。如需详细了解如何确保数据安全,请参阅保护渲染工作负载的安全

目标

  • 使用 Docker 和 Python 安装和配置 OpenCue 模块。
  • 创建一个 OpenCue 数据库并使用架构和示例数据进行填充。
  • 创建 Cloud Storage 资源并使用本教程的动画场景文件进行填充。
  • 在本地配置和创建 Docker 映像,将映像存储在 Container Registry 中,并使用容器启动 Compute Engine 资源。
  • 创建实例模板和托管实例组,以实现计算资源的高效扩缩。
  • 配置工作站以在本地运行 OpenCue 的界面。
  • 使用 OpenCue 界面渲染动画序列并探索作业管理。

费用

您可以使用价格计算器根据预计使用情况来估算费用。

本教程介绍构建正常运行的渲染农场所需执行的所有步骤,并会对机器数量和大小进行严格限制。为了符合 Google Cloud 免费层级价格准则,在本教程中,您将在几个拥有两个 vCPU 的虚拟机上渲染具有低分辨率和采样率的动画。

按总共使用 4 小时计算,本教程所用资源的费用总计为 3.27 美元。

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Container Registry and Compute Engine API。

    启用 API

  5. 确保在本地机器上安装以下软件:
    • Docker:本教程已使用 Docker Engine 版本 18.09.0 进行测试。
    • Python:本教程已使用版本 2.7.10 进行测试。
    • Pip:本教程已使用版本 19.0 进行测试。
    • Virtualenv:本教程已使用版本 16.2.0 进行测试。
    • gcsfuse:本教程已使用版本 0.23.0 进行测试。
    • 最新版本的 Cloud SDK:本教程要求安装 Cloud SDK,以使用 gcloudgsutil 命令行工具。您将在本地工作站的终端上运行 gcloudgsutil 工具。

OpenCue 概览

OpenCue 的界面使用各种模块和命令以及几个独特的概念和术语。以下工具和方法用于部署基本的混合渲染农场。如需了解更高级的主题和不同的部署选项,请参阅 OpenCue 文档

  • Cuebot - OpenCue 的调度工具。Cuebot 用于处理作业分发、管理渲染资源以及与数据库通信。您可以通过命令行界面 (CLI) 使用 Python 和 Bash 访问 Cuebot,但可视界面也作为单独的模块包含在内,详见下文。在此示例中,您将在 Google Cloud 虚拟机上运行 Cuebot。您也可以在本地运行以进行本地部署。或者,如果您要进行大型/混合部署,可以使用多个 Cuebot 实例来实现高可用性。
  • 数据库 - Cuebot 与 PostgreSQL 数据库服务器交互以存储应用的状态。即使在具有多个 Cuebot 的部署中,也只会在实例之间共享一个数据库。在本教程中,我们使用 Cloud SQL 实例来简化部署。
  • CueGUI - 用于与 Cuebot 进行交互的可视化界面。CueGUI 用于监控和管理作业及渲染主机的设置。在本教程中,您将在云端运行 Cuebot,在本地机器上运行 CueGUI。
  • 渲染主机 - 用于处理各项任务的各个渲染资源。这些主机可以位于本地、云端,也可以是二者的组合。在本教程中,您将 Google Cloud 中的虚拟机托管实例组用作渲染主机。
  • RQD - 渲染队列守护进程,在各个渲染主机上运行,并与 Cuebot 交互,以发送和接收有关需要运行的命令的指令。
  • CueSubmit - 用于配置和启动作业的 GUI。您可以将此 Python 程序作为独立 GUI 或第三方软件中的插件运行。OpenCue 包含一个 Maya 插件(已使用版本 2017 及更高版本进行测试)和 Nuke(已使用版本 11 进行测试)。OpenCue 代码库中的代码可以修改,以便为其他第三方工具构建插件或自定义流水线。
  • PyCue - 用于与 Cuebot 进行交互的 Python 库集合。您可以使用这些库来构建更多工具,或者在命令行中与 Cuebot 进行通信,而不是通过 GUI 进行通信。
  • PyOutline - 用于构建 OpenCue 作业提交内容的 Python 库。 PyOutline 允许构建作业规范和定义依赖项。在本教程中,您不会直接与此模块交互,因为 CueSubmit 会在后台调用它。
  • CueAdmin - 一个命令行工具,该工具使用 PyCue python API 来管理 OpenCue。

OpenCue 程序架构

以下架构图说明了 OpenCue 各个模块的连接和通信方式。

OpenCue 架构图

本教程中使用的 Google Cloud 资源

以下架构图说明了完成本教程所需的 Google Cloud 资源。

完成本教程所需的 Google Cloud 资源

下载 OpenCue 代码库

OpenCue 的官方代码库托管在 GitHub 上。

  • 转到您将用于本教程的工作区和目录,并下载 OpenCue 代码库:

    cd ~/
    git clone --branch 0.3.6 https://github.com/AcademySoftwareFoundation/OpenCue
    

创建 Cloud Storage 存储分区并使用教程文件进行填充

本教程使用 Cloud Storage 存储分区来存储所有动画场景文件和其他输入文件依赖项,以及最终的渲染输出和渲染主机日志文件。

在稍后的步骤中,您将安装并使用 Cloud Storage FUSE (gcsfuse)。此工具是一个开源 FUSE 适配器,您可以使用该适配器将 Cloud Storage 存储分区作为文件系统装载在 Linux 渲染主机和本地机器上。gcsfuse 为此工作流提供了经济实惠而有效的存储方案。但是,您可以通过将各个作业与针对其特定需求进行了优化的存储配置文件搭配使用,来显著提高部分作业的性能。Google Cloud 有许多存储方案,但每个工作流的优缺点不在本文的讨论范围内。如需详细了解存储方案,请参阅构建混合渲染农场,或与 Google Cloud 代表联系,以根据您的需求定制存储方案。

创建 Cloud Storage 存储分区

创建存储分区之前,请确保您位于正确的项目中:

  • 创建 Cloud Storage 存储分区 [YOUR_BUCKET_NAME],用于存储教程数据。

    gcloud config set project [YOUR_PROJECT_ID]
        gsutil mb -l us-central1 gs://[YOUR_BUCKET_NAME]
    

    gsutil 命令注明在 us-central1 区域中创建资源。

将教程数据同步到您的存储分区

Cloud Storage 存储分区包含用于本教程的大约 950 MB 数据。使用 gsutil rsync 即可将数据从源存储分区同步到目标存储分区,而无需将这些数据下载到本地机器。请注意用于复制递归子目录的 -r 标志;还有用于并行同步的 -m 标志,该标志在处理多个文件时很有用。

  1. 为您的 Cloud Storage 存储分区名称创建环境变量:

    export YOUR_BUCKET=[YOUR_BUCKET_NAME]
    
  2. 将示例数据同步到您的存储分区:

    gsutil -m rsync -r gs://cloud-solutions-group-opencue gs://$YOUR_BUCKET
    

上传示例数据库架构和数据

上传数据库架构和示例演示数据以填充您的数据库表:

  1. V1__Initial_schema.sqlV2__Add_limit_table.sqlV3__increase_show_length.sql 文件从本地 OpenCue 目录复制到 Cloud Storage 教程存储分区:

    gsutil cp ~/OpenCue/cuebot/src/main/resources/conf/ddl/postgres/migrations/* gs://$YOUR_BUCKET/database/
    
  2. demo_data.sql 文件从本地 OpenCue 目录复制到 Cloud Storage 教程存储分区:

    gsutil cp ~/OpenCue/cuebot/src/main/resources/conf/ddl/postgres/demo_data.sql gs://$YOUR_BUCKET/database/
    

部署数据库

OpenCue 的 Cuebot 模块将程序的状态数据存储在 PostgreSQL 数据库中。在本教程中,您首先要为充当 Cuebot 的虚拟机保留一个外部 IP。然后,您可以预配和配置一个 Cloud SQL 实例,通过将 Cuebot IP 地址列入白名单来设置网络连接,最后使用架构和演示数据填充数据库。

为 Cuebot 预留静态外部 IP 地址

为 Cuebot 创建数据库或虚拟机之前,请为 Cuebot 虚拟机预留一个静态外部 IP 地址,用于在这两种资源之间进行网络通信:

  1. 转到 Cloud Console 中的预留静态地址页面。

    转到“预留静态地址”页面

  2. 为新地址选择一个名称,例如 cuebotstaticip

  3. 对于网络服务层级,请指定优质

  4. 对于 IP 版本,请指定 IPv4

  5. 对于类型,请选择区域

  6. 选择区域 us-central1

  7. 附加目标设置为

  8. 点击保留以保留该 IP。

创建资源后,您将被重定向到外部 IP 地址页面。请将此地址引用为 [RESERVED_STATIC_IP_ADDRESS]

创建 Cloud SQL 实例

您可以通过多种方式创建 PostgreSQL 数据库。本教程使用 Cloud SQL,它在 Google Cloud 上提供了易于设置的全托管式数据库。此实例使用 SSD 进行快速读写,但初始存储容量较小,只有 1个 vCPU 和 3.75 GB 的 RAM。扩缩 OpenCue 以进行较大型部署时,此资源是您希望增长的首要资源之一,而 Cloud SQL 可以随您的部署一起扩缩。

  1. 转到 Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 选择您的项目并点击继续

  3. 点击创建实例

  4. 点击 PostgreSQL

  5. 请输入实例 ID,例如 opencuedatabase

  6. 为默认的 postgres 用户输入密码。创建 Cuebot 时,请将此密码引用为 [DATABASEPASSWORD]

  7. 区域设置为 us-central1,将地区设置为 us-central1-a

  8. 配置连接选项:

    1. 打开显示配置选项并选择连接
    2. 选择公共 IP+添加网络
    3. 网络中,输入您的 [RESERVED_STATIC_IP_ADDRESS]
    4. 点击创建

    您将返回到实例列表;当您的新实例进行初始化并启动时,亮度会变暗。

创建 Cloud SQL 数据库

  1. 在 Cloud SQL 资源的实例详情页面中,选择数据库
  2. 选择创建数据库
  3. 数据库名称设置为 cuebot
  4. 点击创建
  5. 导入数据库架构和演示数据:

    1. 选择导入
    2. 在 Cloud Storage 文件行中,点击浏览
    3. 转到您上传数据的 [YOUR_BUCKET_NAME] 存储分区,通过选择以下文件导入数据库的架构:

      gs://[YOUR_BUCKET_NAME]/database/V1__Initial_schema.sql
      
    4. 导入文件的格式设置为 SQL

    5. 对于数据库,选择 cuebot

    6. 选择显示高级选项

    7. 用户中,选择用户 postgres

    8. 点击导入

    导入完成后,您将被重定向到 Cloud SQL 实例详情 (Cloud SQL Instance details) 页面。

    重复上述步骤,以从以下文件导入演示数据:

    gs://[YOUR_BUCKET_NAME]/database/V2__Add_limit_table.sql
    gs://[YOUR_BUCKET_NAME]/database/V3__increase_show_length.sql
    gs://[YOUR_BUCKET_NAME]/database/demo_data.sql
    

这些导入完成后,您将被重定向到 Cloud SQL 实例详情 (Cloud SQL Instance details) 页面。记下 Cloud SQL IP 地址(稍后称为 [CLOUD_SQL_IP_ADDRESS]),您在后续步骤中配置 Cuebot 时需要用到。

准备 Cuebot Docker 映像以进行部署

在本教程中,Cuebot 在单个 Compute Engine 虚拟机上作为 Docker Container 进行部署。首先,请通过 OpenCue 代码库在本地构建 Cuebot Docker 映像并将其推送到 Container Registry。Container Registry 是 Google Cloud 上的私有 Docker 映像代码库,您可以用来存储本教程中的 Docker 映像。如需详细了解此工作流,请参阅 Compute Engine 文档

创建映像

  1. 确保您位于 OpenCue 代码库的根级目录:

    cd ~/OpenCue
    
  2. 创建一个名为 TAG_NAME 的变量和一个名为 PROJECT_NAME 的变量,然后使用 Docker 构建一个带有此标记的映像以进行跟踪。通过在构建步骤中添加 gcr.io/[PROJECT_NAME],您可以启用标记功能以便稍后同步到 Container Registry。

    export TAG_NAME=demo
    export PROJECT_NAME=[PROJECT_NAME]
    docker build -t gcr.io/$PROJECT_NAME/opencue/cuebot:$TAG_NAME -f cuebot/Dockerfile .
    

将映像同步到 Container Registry

gcloud 工具授权,以允许 Docker 将映像上传到 Container Registry。然后,将您的 Cuebot Docker 映像同步到 Container Registry。

  1. 运行以下命令以向 gcloud 工具和 Docker 同步授权:

    gcloud auth configure-docker
    
  2. 在以下提示符处输入 y,然后按 Enter 键。

    Do you want to continue (Y/n)?
  3. 将 Cuebot Docker 映像从本地代码库推送到 Container Registry:

    docker push gcr.io/$PROJECT_NAME/opencue/cuebot:$TAG_NAME
    

此上传需要一些时间,然后才能完成同步。

配置和预配 Cuebot 虚拟机

通过控制台,使用 Container Optimized OS 预配虚拟机、配置容器设置、建立与数据库的连接,以及附加保留的外部静态 IP 地址。

  1. 转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。

  3. 将您的实例命名为 cuebot

  4. 区域设置为 us-central1,将地区设置为 us-central1-a

  5. 机器类型中,选择自定义并将机器类型配置为 1 个 vCPU 6.5 GB。

  6. 配置容器设置:

    1. 容器部分中,选择部署容器映像
    2. 更新 [PROJECT_NAME] 并指定以下容器映像

      gcr.io/[PROJECT_NAME]/opencue/cuebot:demo

    3. 展开高级容器选项

    4. 命令参数下方,通过点击 + 添加参数三次添加三个参数。

    5. 输入以下命令参数,并将 [CLOUD_SQL_IP_ADDRESS][DATABASEPASSWORD] 替换为您的值。

      --datasource.cue-data-source.jdbc-url=jdbc:postgresql://[CLOUD_SQL_IP_ADDRESS]/cuebot
      --datasource.cue-data-source.username=postgres
      --datasource.cue-data-source.password=[DATABASEPASSWORD]
      

      其中:

      命令参数 说明和需要的输入内容
      --datasource.cue-data-source.jdbc-url=jdbc:postgresql://[CLOUD_SQL_IP_ADDRESS]/cuebot 启用从 Cuebot 到数据库的通信。输入内容为 [CLOUD_SQL_IP_ADDRESS]/[DATABASE_NAME]。您在先前步骤中使用了 cuebot 作为数据库名称,因此需要在此处输入该名称。
      --datasource.cue-data-source.username=postgres 连接时,Cuebot 要求提供数据库用户名。在设置过程中,您使用了默认用户名 postgres,因此需要在此输入该用户名。对于生产环境,您应遵循安全性方面的最佳做法,并创建具有特定权限的新用户。
      --datasource.cue-data-source.password=[DATABASEPASSWORD] 连接时,Cuebot 要求输入数据库密码。在此处输入 [DATABASEPASSWORD]
  7. 配置网络设置:

    1. 网络下方,选择网络接口
    2. 点击外部 IP,然后选择先前为 Cuebot (cuebotstaticip) 创建的预留外部 IP 地址。
    3. 点击完成
    4. 将其余设置保留为默认值。
    5. 点击创建

您的虚拟机需要一些时间启动。记下内部 IP 地址,您在创建实例模板时需要用到。该地址稍后将称为 [CUEBOT_INTERNAL_IP_ADDRESS]

创建渲染主机

您的渲染主机由作为托管实例组 (MIG) 运行的虚拟机组成,托管实例组可以控制资源的位置和扩缩。 MIG 使用实例模板来确定机器类型、启用服务帐号管理、部署容器映像,以及配置容器设置和环境变量。

容器映像用于配置运行教程渲染任务所需的许多依赖项和软件包。如需为项目配置容器映像,请使用 Docker 创建基本渲染主机映像,并将其存储在本地代码库中。然后,在将此基本渲染主机映像部署到 Container Registry 之前,您可以通过从教程代码库添加特定于任务的软件和 Google Cloud 设置来对它进行自定义设置。

创建基本渲染主机映像

  • 在您的本地 shell 中,创建基本渲染主机映像。

    cd ~/OpenCue
    export TAG_NAME=demo
    docker build -t opencue/rqd:$TAG_NAME -f rqd/Dockerfile .
    

配置 Blender 映像

创建渲染主机 Blender 映像所需的 Dockerfile 和相关脚本位于本教程代码库中。在本部分中,您将下载该代码库并更新一些设置以使其适用于您的项目。

  1. 转到您为本教程使用的目录和工作区,然后下载教程代码库。

    cd ~
    git clone https://github.com/GoogleCloudPlatform/python-opencue-demo.git
    
  2. 渲染主机启动时,此代码库中的 rqd_startup.sh 脚本会调用 gcsfuse 以将您的教程存储分区作为文件系统装载在路径 /shots 下。在文本编辑器中打开 Dockerfile 并更新 GCS_FUSE_BUCKET 变量以指向您的教程存储分区:

    1. 在 shell 中,将以下文件复制到代码库的根目录。

      cp ~/python-opencue-demo/third_party/Dockerfile ~/python-opencue-demo/Dockerfile
      
    2. 在您选择的文本编辑器中,修改此文件:

      ~/python-opencue-demo/Dockerfile
      
    3. 在以下行中使用您的存储分区名称更新 [YOUR_BUCKET_NAME]

      ENV GCS_FUSE_BUCKET [YOUR_BUCKET_NAME]
      
    4. 保存该文件,然后退出文本编辑器。

构建映像并将其推送到 Container Registry

  1. 构建映像:

    cd ~/python-opencue-demo
    docker build -t gcr.io/$PROJECT_NAME/opencue/rqd-blender:$TAG_NAME .
    
  2. 构建完成后,将映像推送到 Container Registry:

    docker push gcr.io/$PROJECT_NAME/opencue/rqd-blender:$TAG_NAME
    

部署渲染主机

渲染时,您的渲染主机必须具有读写权限。如需为渲染主机授予访问权限,请按照最小权限安全原则创建服务帐号。预配虚拟机时,请为“身份和 API 访问权限”使用此帐号。

创建服务帐号

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开

  4. 点击 + 创建服务帐号

  5. 输入 [SERVICE_ACCOUNT_NAME](例如 storageservice),然后点击创建

  6. 为服务帐号选择 Storage Object Admin 角色,然后点击继续

  7. 点击完成

创建实例模板

使用 rqd-blender Docker 映像,创建实例模板以确定虚拟机大小和设置:

  1. 在 Cloud Console 中,转到实例模板页面。

    转到“实例模板”页面

  2. 点击创建实例模板

  3. 为您的实例模板命名,例如 rqd-blender

  4. 机器类型中,选择 n1-highmem-2

  5. 配置容器设置:

  6. 容器部分中,选中将一个容器映像部署到此虚拟机实例复选框。

  7. 更新 [PROJECT_NAME] 并为容器映像指定以下内容:

    gcr.io/[PROJECT_NAME]/opencue/rqd-blender:demo
    
  8. 允许访问系统设备以在启动时向 Cuebot 注册 RQD-blender 实例:

    1. 点击高级容器选项
    2. 选择以特权模式运行
    3. 点击环境变量下方的 + 添加变量,将名称设置为 CUEBOT_HOSTNAME,将设置为 [CUEBOT_INTERNAL_IP_ADDRESS],也就是您之前预配的 Cuebot 虚拟机的内部 IP 地址。
  9. 配置服务帐号:

    1. 服务帐号部分中,选择您之前创建的 [SERVICE_ACCOUNT_NAME]
    2. 将其余设置保留为默认值。
    3. 点击创建

创建托管实例组

使用实例模板,创建一个托管实例组以确定虚拟机位置、实例数以及自动扩缩设置。

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组

  3. 为托管实例组输入一个名称,例如 rqd-blender-mig

  4. 选择单个地区,其中区域为 us-central1,地区为 us-central1-a

  5. 组类型下方,选择托管实例组

  6. 实例模板下方,选择您的实例模板,例如 rqd-blender

  7. 自动扩缩设置为关闭

  8. 对于实例数,请指定 3

  9. 点击创建

配置您的本地工作站

Cuebot 现已在 Google Cloud 上运行,已准备好管理您的渲染主机和作业队列。如需启用用于提交和管理任务的直观界面,请将您的本地工作站配置为运行 CueSubmit 和 CueGUI,然后从本地主机连接到 Google Cloud。

创建目录并为存储分区装载点设置权限

  • 为您的 Cloud Storage 存储分区创建一个装载点,并将其权限设置为读写。

    sudo mkdir /shots
    sudo chmod 777 /shots
    sudo chown $USER /shots
    

    当装载在本地工作站和渲染主机上时,这些路径将解析至类似 /shots/robotdanceparty/sh_05/sh_05_lores.blend 的位置,用于储存输入动画场景文件。

装载您的教程存储分区

  • 指示 gcsfuse 将您的教程存储分区作为文件系统装载在本地机器的路径 /shots 下。--implicit-dirs 标志用于帮助引导对象到目录的映射。

    gcsfuse --implicit-dirs $YOUR_BUCKET /shots
    

    设置 SSH 转发

为了帮助保护您的本地工作站与 Google Cloud 之间的通信安全,本教程使用 SSH 转发。以下命令将打开一个端口,用于转发 OpenCue 界面与 Cuebot 之间的调用。

  1. 打开一个新的 shell 窗口并将其预留用于 SSH 进程。
  2. 更新 [YOUR_PROJECT_ID] 并运行以下命令:

    export CUEBOT_INSTANCE_NAME=cuebot
    export PROJECTID=[YOUR_PROJECT_ID]
    export ZONE=us-central1-a
    gcloud compute ssh $CUEBOT_INSTANCE_NAME --project $PROJECTID --zone $ZONE -- -N -L 8443:127.0.0.1:8443
    

初始化虚拟环境

  1. 打开一个新的 shell 窗口并将其预留用于 CueGUI 和 CueSubmit。
  2. 如需在安装之前隔离您的环境,请运行 virtualenv

    cd ~/OpenCue
    virtualenv --python python2 venv
    

    详细了解 virtualenv

  3. 使用 pip 确定虚拟环境来源并安装依赖项。

    source venv/bin/activate
    pip install -r requirements.txt
    

    您可以运行 cat requirements.txt 来查看已安装的依赖项列表。

  4. 启动 CueGUI 或 CueSubmit 之前,请定义部署所需的变量。

    export OPENCUE_ROOT=~/OpenCue
    export CUEBOT_HOSTS=localhost
    export PYTHONPATH=$OPENCUE_ROOT/pyoutline/:$OPENCUE_ROOT/pycue/:$OPENCUE_ROOT/cuesubmit/:$OPENCUE_ROOT/cuegui/
    
    环境变量 说明
    CUEBOT_HOSTS=localhost 参考 PyCue 如何连接到 Cuebot 实例。使用 SSH 转发时,它定义为 localhost。如果您使用的是 VPN 或专用互连,请输入 Cuebot IP 地址。
    PYTHONPATH=$OPENCUE_ROOT 定义 OpenCue 库的 Python 路径。

编译 gRPC proto

OpenCue 使用 gRPC 作为其通信协议,在服务器和客户端之间发送消息。 gRPC 服务是使用与语言无关的 .proto 文件中的协议缓冲区定义的。如需使 OpenCue 的 Python 库能够使用 gRPC 进行通信,请执行以下操作:

  • 使用以下命令将 .proto 定义文件编译为 Python 可读文件:

    cd ~/OpenCue/proto
    python -m grpc_tools.protoc -I=. --python_out=$OPENCUE_ROOT/pycue/opencue/compiled_proto --grpc_python_out=$OPENCUE_ROOT/pycue/opencue/compiled_proto ./*.proto
    

运行界面

在接下来的步骤中,您将通过使用 CueSubmit 提交作业来探索 OpenCue,并通过 CueGUI 探索作业和渲染主机的设置。这两个工具都使用相同的环境,因此在虚拟环境 shell 中运行这些工具时,请对每个进程进行后台处理。

运行 CueSubmit

  • 在虚拟机环境 shell 中,运行 CueSubmit 以便提交作业:

    cd ~/OpenCue
    python cuesubmit/cuesubmit &
    

提交作业

使用 CueSubmit 界面,输入以下变量:

  1. 输入作业名称 (Job Name),例如 yourjobname
  2. 输入镜头 (Shot),例如 sh_05
  3. 输入图层名称 (Layer Name),例如 render
  4. 要运行的命令 (Command to Run) 中,输入以下命令。

    /usr/local/blender/blender -b -noaudio /shots/robotdanceparty/sh_05/sh_05_lores.blend -o /shots/renderimages/sh_05.lores.##### -F JPEG -f #IFRAME#
    
  5. 帧规范 (Frame Spec) 中,输入 600-700

  6. 作业类型 (Job Type) 设置为 Shell

  7. 服务 (Job Type) 设置为 shell

  8. 将其余设置保留为默认值,然后点击提交 (Submit)。

    此时将显示一个窗口,提示“已将作业提交至 OpenCue”。其中包含作业 ID 和作业名称,以帮助您跟踪渲染。

    用于渲染的命令行选项:

    命令行选项 说明
    /usr/local/blender/blender Blender 可执行文件的路径。
    -b 通知渲染程序在没有界面的情况下运行的标志。
    -noaudio 通知渲染程序不要加载音频库的标志。
    /shots/robotdanceparty/sh_05/sh_05_lores.blend 需要渲染的场景文件的路径。
    -o /shots/renderimages/sh_05.lores.##### 定义输出路径、名称和帧填充。##### 导致帧 650 在磁盘上为 sh_05.00650.jpg
    -F JPEG 将输出文件类型定义为 JPEG。
    -f #IFRAME# 定义渲染时的帧编号,并且特定于 OpenCue。 <Frame Spec> 与此变量交互,因此请按此处原样输入。

    如需详细了解 Blender 命令行渲染,请参阅 Blender 文档

    “已提交作业”(Submitted job) 窗口

    变量 说明
    作业名称 您在开始时选择的任意变量。大多数设施遵循命名惯例来以实现一致性地跟踪作业。
    用户名 由 OpenCue 填入。在用户启动 CueSubmit 时注册。
    节目 OpenCue 会在开始时创建一个名为 testing 的默认节目。 在这种情况下,大多数设施都会调用各个电影项目或商业节目。最好使用 CueAdmin 命令行工具添加和修改节目。
    镜头 一系列不间断播放的帧中的一个。在电影中,一个镜头是指“开始”(Action) 和“停”(Cut) 之间的影像。通常用于前期制作过程中的序列或素材资源轮播的各个镜头。
    图层 提交内容和帧范围中的单个命令。在此示例中,您在作业中运行单个图层 (render)。
    要运行的命令 图层将运行的命令。在这里,您运行的是 Blender 命令行渲染。
    帧规范 要处理的帧。您的动画的渲染帧为 600-700。 指向帧规范 (Frame Spec) 框可查看更多选项,例如帧步进和任意帧输入。
    作业类型 用于定义作业中此图层使用的软件包。您定义的命令会被解读为 shell 脚本,因此请输入 Shell
    服务 需求列表,例如最小 RAM 或用户定义的资源。 您的作业不需要 shell 以外的特定要求,因此请选择 Shell
    提交内容详情 您的设置的综合结果。

CueGUI 概览

CueGUI 是一系列界面模块的中心界面,每个模块着重于渲染农场的不同方面。以下是用于监控作业和渲染主机的常用术语、说明和相关模块的列表。如需深入、直观地了解 CueSubmit 和 CueGui,请观看此演示视频

术语 说明 相关的 CueGUI 模块
作业 传送给 OpenCue 的单个提交内容。 监控作业
特性
图层 提交内容和帧范围中的单个命令。在此示例中,您在作业中运行单个图层 (render)。 监控作业详情
特性
渲染主机 用于处理任务的单个渲染资源。 监控作业详情
监控主机
LogView
特性
日志 渲染主机将日志文件写入磁盘,解析日志可获取问题排查或性能指标等信息。 监控作业详情
LogView
特性 有关 OpenCue 提交内容或资源的详细信息列表。特性 (Attribute) 窗口可以加载有关作业、图层或渲染主机的详细信息。 监控作业
监控作业详情
监控主机
特性
标记 一种分类方法,可以添加到主机或图层以将其与某些作业相关联。您可以为每个渲染主机上的可用资源添加主机标记,并为处理图层所需的资源添加图层标记。 监控作业详情
监控主机
特性
图层标记 定义处理图层所需要求的标记。例如,图层可能需要 GPU,因此您需要向图层添加 GPU 标记。 监控作业详情
监控主机
特性
主机标记 定义主机可用的资源的标记。例如,您可以将 GPU 资源添加到已安装 GPU 的主机。
如果满足这些标记和资源要求列表,主机将获取要渲染的图层。
监控作业详情
监控主机
特性

本教程不对 OpenCue 的界面和概念进行详细介绍。如需了解详情,请参阅相关文档

运行 CueGUI

  • 在同一个虚拟环境 shell 中,打开 CueGUI:

    cd ~/OpenCue
    python cuegui/cuegui &
    

打开“监控作业”窗口

  • 当 CueCommander 窗口打开时,选择视图/插件 (Views/Plug-ins) > Cuetopia > 监控作业 (Monitor Jobs)。

关于“监控作业”窗口

监控作业 (Monitor Jobs) 窗口显示作业级层的信息,因此呈现为概览视图。

OpenCue 中的“监控作业”(Monitor Jobs) 窗口

在包含 [Your Job] 的行上,查找本教程的以下相关信息:

  • 作业 (Job):您的作业名称列在此处。
  • 状态 (State):此作业在进行中 (In Progress),因为它已经获取并且正在渲染。作业完成后,状态 (State) 将更改为已完成 (Finished)。如果作业出现问题,状态将更改为失败 (Failing),您需要进行问题排查。如需详细了解如何在 OpenCue 中对渲染进行问题排查,请参阅相关文档。
  • 完成/总计 (Done/Total):提供作业进度的概览。在图片中,总共 101 帧的作业,有 100 帧已完成。
  • 正在运行:通知您当前在渲染主机上处理的帧数。在此图片中,仅有 1 帧正在处理。
  • 进度 (Progress):提供作业进度的直观概览。

浏览“监控作业”(Monitor Jobs) 窗口

  1. 监控作业 (Monitor Jobs) 窗口中监控作业的进度。您的作业状态应该是进行中 (In Progress)。如果是失败 (Failing),请参阅问题排查部分。
  2. 将鼠标悬停在进度一词上。此时将显示一个说明窗口,其中包含有用的工具信息。
  3. 将鼠标悬停在其他行标题和图标上,浏览界面。
  4. 选择 [Your Job]

打开“监控作业详情”(Monitor Job Details) 窗口

  1. 如需打开监控作业详情 (Monitor Jobs Details) 窗口,请选择视图/插件 (Views/Plug-ins) > Cuetopia > 监控作业详情 (Monitor Job Details)。
  2. 监控作业 (Monitor Jobs) 窗口中,双击 [Your Job] 以在监控作业详情 (Monitor Jobs Details) 窗口中加载其数据。

关于“监控作业详情”(Monitor Job Details) 窗口

监控作业详情 (Monitor Job Details) 窗口显示图层级层的信息,包含有关作业的详细信息。

OpenCue 中的“监控作业详情”(Monitor Job Details) 窗口

监控作业详情 (Monitor Job Details) 模块包含两个窗口:

  • 图层 (Layer) 窗格。在标题栏中有 [Your Job] 的窗口中,您可以看到图层名称。
  • 图层信息 (Layer Info) 窗格。在此窗口中,您可以看到与所选图层的每个帧相关的信息。

图层 (Layer) 窗格概览:

  • 图层 (Layer):您的作业有一个图层,名为 render。如果您的作业有多个图层,会在此处列出,并且可通过双击单独选择。
  • 平均值 (Avg):此图层的每帧渲染时间的平均值。
  • 标记 (Tags):此处列出图层级别标记。本教程不介绍如何设置标记,但此处是访问图层级别标记的位置。
  • 依赖 (Depend):图层依赖项列在此处。本教程不介绍如何管理依赖项,但此框是访问图层级别依赖项的位置。

图层信息 (Layer Info) 窗格概览:

  • 刷新按钮:点击此按钮可使用数据库中的最新信息重新加载界面。
  • 排序:帧的渲染顺序,在此处列出是因为帧可以按任意顺序渲染。例如,您可以每隔 10 帧渲染,然后渲染其余帧,或者以相反的顺序渲染。此顺序在您提交作业时在 CueSubmit 中使用“帧规范”(Frame Spec) 指定。
  • 帧数 (Frame):将渲染的场景的帧数。
  • 状态:帧的状态。在此图片中,这些帧的渲染已成功 (Succeeded)。
  • 主机:分配了帧的渲染主机 IP 地址。

浏览“监控作业详情”窗口

  1. 点击刷新并在监控作业详情 (Monitor Job Details) 窗口中检查作业的进度。
  2. 将鼠标悬停在状态一词的上方,即会显示一个说明窗口,其中包含有用的工具信息。
  3. 将鼠标悬停在其他行标题和图标上,浏览界面。

打开 LogView 窗口

  • 要打开 LogView 窗口,请选择视图/插件 (Views/Plug-ins) > 其他 > LogView

关于 LogView 窗口

LogView 窗口提供各个帧的日志的快速预览。 此视图对于收集有关问题排查的信息、为将来的渲染过程合理调整虚拟机大小,或者优化渲染非常有用。

OpenCue 中的“日志视图”(Log View) 窗口

日志文件的起始内容为包含特定于 OpenCue 的数据的标题,后接处理图片的软件的输出。在此实例中,您会看到 OpenCue 配置,然后是 Blender 日志输出。

浏览 LogView 窗口

  1. 监控作业详情 (Monitor Job Details) 窗口中,在图层信息 (Layer Info) 窗格中选择一个加有已成功 (SUCCEEDED) 标签的帧以检查日志。
  2. 注意正在运行的命令。
  3. 注意 logDestination

您可以在 OpenCue 文档中详细了解 LogView 窗口

打开“监控主机”窗口

  • 要打开监控主机 (Monitor Hosts) 窗口,请选择视图/插件 (Views/Plug-ins) > CueCommander > 监控主机 (Monitor Hosts)。

关于“监控主机”窗口

监控主机 (Monitor Hosts) 窗口提供有关各个渲染主机的信息,也是使用标记添加或移除资源的界面。

OpenCue 中的“监控主机”(Monitor Hosts) 窗口

以下信息与本教程相关:

  • 自动刷新框:选中此框可重新加载监控主机 (Monitor Hosts) 窗口。
  • 刷新 (Refresh):点击此按钮可重新加载监控主机 (Monitor Hosts) 窗口。
  • IP 地址 (IP address):IP 地址有助于轻松跟踪 OpenCue 和 Google Cloud 之间的虚拟机。
  • 负载百分比 (Load %):主机上的平均负载,是机器使用情况的有效指标。
  • 内存 (Mem):主机内存分配。
  • 标记 (Tags):主机上的注册资源。

浏览“监控主机”(Monitor Hosts) 窗口

  1. 点击刷新 (Refresh),或选中自动刷新 (Auto-refresh) 复选框。
  2. 通过点击渲染主机的 IP 地址来选择渲染主机。
  3. 右键点击渲染主机以查看更多选项,例如删除主机 (Delete Host) 或添加或移除标记 (Add or Remove Tags)。

    如需详细了解如何使用标记管理资源,请参阅相关文档

  4. 双击主机以查看其特性。

  5. 注意 alloc,其设置为 local.general

  6. 注意标记(general 标记)和主机的 IP 地址。

打开“特性”(Attributes) 窗口

  • 选择视图/插件 (Views/Plug-ins) > 其他 (Other) > 特性 (Attributes)。

关于“属性”窗口

属性窗口提供有关渲染主机、图层或作业的详细信息列表。以下是具体示例。

OpenCue 的“特性”(Attributes) 窗口

每个窗口都包含与主机、图层或作业相关的信息。作业特性 (Job Attributes) 中的 facility local 标记和图层特性 (Layer Attributes) 中的 general 标记是此提交内容要求的主要指标。此作业的帧仅在分配有这两个标记的渲染主机上获取。查看 alloctags 行,您可以看到主机特性 (Host Attributes) 中分配了这些标记。

浏览“属性”窗口

  1. 监控主机 (Monitor Hosts) 窗口中,点击渲染主机 IP 地址以加载其属性。
  2. 属性窗口中,检查 alloctags 设置。
  3. 监控作业详情 (Monitor Job Details) 窗口中,点击已成功的帧以加载其属性。
  4. 属性窗口中,浏览 minMemorytags 设置。
  5. 监控作业 (Monitor Jobs) 窗口中,点击一个作业。
  6. 特性 (Attributes) 窗口中,浏览 facilityminCores 设置。

如需了解更全面的说明,请参阅 CueGUI 参考

查看渲染的帧

有多种方法可以在渲染时查看所渲染的帧,或者在渲染完成后在本地复制所渲染的帧。本教程不介绍如何安装动画预览工具,但您可以使用 Cloud Console 预览各个帧,或者在本地下载帧以在您喜欢的图片查看应用中查看。

  1. 在 Cloud Console 中,查看存储分区中的对象列表,或在浏览器中预览图片:

    转到 Cloud Storage 页面

  2. 点击 [YOUR_BUCKET_NAME],然后点击 renderimages 以查看帧列表。

  3. 点击一个图片(例如 sh_05_lores.00650.jpg),以使用浏览器窗口进行预览。

  4. 使用您的本地 shell 列出输出目录中的图片:

      ls /shots/renderimages
    

    您也可以在本地复制文件,或在您选择的查看工具中打开。

  5. 使用 gsutil 列出存储分区中的对象:

    gsutil ls gs://[YOUR_BUCKET_NAME]/renderimages
    
  6. 使用 gsutil 将存储分区中的所有对象复制到本地目录 [LOCAL_DIRECTORY]

    mkdir ~/[LOCAL_DIRECTORY]
    gsutil -m rsync -r gs://[YOUR_BUCKET_NAME]/renderimages ~/[LOCAL_DIRECTORY]
    

查看作业完成

如果渲染仍在处理中,您可以选择完成渲染并进一步探索 OpenCue,或者通过在监控作业 (Monitor Jobs) 窗口中终止作业来停止渲染。

要在 OpenCue 中终止作业,请执行以下操作:

  1. 打开监控作业 (Monitor Jobs) 窗口。
  2. 选择 [Your Job],然后点击终止作业 (Kill Job) 按钮。
  3. 随即会显示一个弹出窗口,询问:“您确定要终止这些作业吗?”(Are you sure you want to kill these jobs?)。
  4. 点击确定 (OK) 以终止作业。

(可选)浏览渲染农场的选项

为了使本教程的 vCPU 总数保持在总共 8 个的限制内,您已经为渲染任务部署了一些适度大小的渲染主机。假设您的目标是快速完成作业,或者创作一段可以在大屏幕上播放的动画。如果是这样,您可以通过修改现有实例模板以使用 n1-highcpu-4 vCPU 或更高版本,以及创建托管实例组来控制作业可用的渲染主机总数量,从而使用更多 CPU 部署更多数量的资源。

您在 n1-standard-2 虚拟机上以每帧约 1 分钟的速度渲染了以下低分辨率场景文件。

  • 场景文件:

    gs://[YOUR_BUCKET_NAME]/robotdanceparty/sh_05/sh_05_lores.blend
    
  • 所得的图片:

    机器人舞会的低分辨率图片

    您的教程存储分区包含一个分辨率更高的场景文件,使用 n1-highcpu-4 虚拟机渲染时会在大约 8 分钟内创建与此类似的图片。

    如果要尝试 OpenCue 中的其他选项,请升级 CueSubmit 命令以引用此分辨率更高的文件。

  • 场景文件:

    gs://[YOUR_BUCKET_NAME]/robotdanceparty/sh_05/sh_05.blend
    
  • 所得的图片:

    分辨率略高的同一张机器人图片

(可选)申请更改配额

如果您想增加渲染主机的数量或使用更大型的虚拟机,可能需要增加项目的配额。

  1. 转到配额页面。

    转到“配额”页面

  2. 配额页面中,选择要更改的配额。

  3. 点击页面顶部的修改配额按钮。

  4. 选中要修改的服务所对应的复选框。

  5. 输入您的姓名、电子邮件和电话号码,然后点击下一步

  6. 输入您申请增加的具体配额,然后点击下一步

  7. 提交您的申请。

问题排查


问题:Docker 构建流程出现问题。

解决方案:尝试使用 --no-cache 标志构建 Dockerfile,强制 Docker 为所有步骤使用全新数据。如需详细了解 Docker 构建选项,请参阅相关文档。


问题:启动 CueSubmit 或 CueGUI 时,shell 中出现 Connect Failed 错误。通常类似于以下错误消息:

Encountered a server error. StatusCode.UNAVAILABLE : Connect Failed

解决方案:确保 SSH 隧道运行正常,然后重启 CueSubmit 或 CueGUI。

  1. 在本地 shell 中运行进程状态命令以确保 SSH 隧道已打开:

    ps aux | grep ssh.
    

    随即会显示一个进程列表。其中一个进程的输出应如下所示,其中包含您的 [USER_NAME][PROJECT_NAME] 和操作系统:

    [USER_NAME]     75335   0.0  0.3  4392464  54736 s002  T     3:03PM   0:00.84  /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python -S /Users/[USER_NAME]/google-cloud-sdk/lib/gcloud.py compute ssh cuebot --project [PROJECT_NAME] --zone us-central1-a -- -N -L 8443:127.0.0.1:8443
    
  2. 确保您的部署的 [USER_NAME][PROJECT_NAME]--zone 和名称 (cuebot) 正确无误。

  3. 终止 SSH 进程并重新执行本文档“设置 SSH 转发”部分中的步骤,以打开新的 SSH 隧道。


问题:CueSubmit 或 CueGUI 可以打开,但在其启动 shell 中提示出现错误。

解决方案:连接到您的 Cloud SQL 实例,确保该实例已填充架构和示例数据。如果未看到预期结果,请在创建 Cloud SQL 数据库部分中再次导入文件(请参阅步骤“导入数据库架构和演示数据”)。

  1. 在 Cloud Console 中,转到 Cloud Shell,然后运行以下命令来更新 Cloud SQL 实例。将 [CLOUD_SQL_INSTANCE_ID] 替换为您的实例名称。

    gcloud sql connect [CLOUD_SQL_INSTANCE_ID] --user=postgres
    
  2. 出现提示时,更新 [DATABASEPASSWORD] 并按 Enter 键:

    [DATABASEPASSWORD]
    
  3. 输入以下命令,然后按 Enter 键:

    \c cuebot
    
  4. 出现提示时,重新输入密码,然后按 Enter 键:

    [DATABASEPASSWORD]
    
  5. 输入以下命令:

    \d+
    

    您应会看到如下所示的输出:

    >
    List of relations
    Schema | Name     | Type  | Owner    | Size       | Description
    -------+----------+-------+----------+------------+-------------
    public | action   | table | postgres | 8192 bytes |
    public | alloc    | table | postgres | 8192 bytes |
    public | comments | table | postgres | 8192 bytes |
    public | config   | table | postgres | 8192 bytes |
    public | deed     | table | postgres | 0 bytes    |
    public | depend   | table | postgres | 0 bytes    |
    public | dept     | table | postgres | 8192 bytes |
    

问题:CueSubmit 或 CueGUI shell 中出现错误,并且两个工具都无法运行。

解决方案:通过检查以下变量,确保 CueBot 与数据库之间的连接正常:

  1. 确保您在创建 Cloud SQL 实例部分的“网络”步骤中正确输入了 [RESERVED_STATIC_IP_ADDRESS]
  2. 确保您在配置和预配 Cuebot 虚拟机部分的“命令参数”步骤中正确输入了 [CLOUD_SQL_IP_ADDRESS][DATABASEPASSWORD]
  3. 确保您在配置和预配 Cuebot 虚拟机部分的“配置网络设置”步骤中正确输入了预留的外部 IP 地址。

问题:一个已启动的作业列在 OpenCue 中,但未在渲染主机上获取。

解决方案:确保作业设施 (Job Facility) 和作业图层 (Job Layer) 标记与指定的渲染主机 (Render Host) 标记一致,并且满足最低资源要求。 如需了解详情,请参阅 OpenCue 渲染问题排查部署问题排查文档。


问题:渲染主机未显示在 CueGui 中。

解决方案:若干问题可能导致主机未显示,最有可能是在部署渲染主机实例模板时输入的 Cuebot 内部 IP 地址不正确。如需了解详情,请参阅部署问题排查文档。

清理

为避免因本教程中使用的资源导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤