

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 向作业模板添加任务分块
<a name="build-job-bundle-chunking-add"></a>

以下过程将每个任务渲染一帧的作业模板转换为呈现大块帧的作业模板。有关分块的背景以及如何选择区块大小，请参阅。[作业模板的任务分块](build-job-bundle-chunking.md)

在开始之前，您需要：
+ 带有任务模板的任务捆绑包，用于定义框架任务参数。有关更多信息，请参阅 [任务包的作业模板元素](build-job-bundle-template.md)。
+ 与支持分块的队列关联的队列。 Service-managed 舰队始终运行兼容的工作器代理。 Customer-managed 舰队要求工作人员代理版本 0.28.21 或更高版本。

**向作业模板添加任务分块**

1. 将`TASK_CHUNKING`扩展名添加到`template.yaml`文件顶部：

   ```
   specificationVersion: 'jobtemplate-2023-09'
   extensions:
     - TASK_CHUNKING
   ```

   如果跳过此步骤，任务创建将失败并显示错误 `The CHUNK[INT] task parameter requires the TASK_CHUNKING extension.`

1. 在步骤中`parameterSpace`，将帧任务参数类型从更改`INT`为`CHUNK[INT]`并添加`chunks`属性：

   ```
   taskParameterDefinitions:
     - name: Frame
       type: CHUNK[INT]
       range: "{{Param.Frames}}"
       chunks:
         defaultTaskCount: 10
         rangeConstraint: CONTIGUOUS
   ```

   有关所有可用字段，请参阅[CHUNK [INT] 任务参数参考](build-job-bundle-chunking-reference.md)。

1. 更新该步骤的脚本以接受帧范围而不是单个帧。使用时`rangeConstraint: CONTIGUOUS`，`{{Task.Param.Frame}}`变量始终会扩展到一个`start-end`格式范围，因此脚本可以使用以下`cut`命令将其拆分：

   ```
   START_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f1)"
   END_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f2)"
   ```

   使用`rangeConstraint: NONCONTIGUOUS`，变量扩展为任意范围表达式，例如`1-3,5,7-20:2`。将表达式转换为应用程序接受的语法。要了解有效的转换，请参阅[任务分块示例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/task_chunking)。 GitHub

1. 使用 Deadline Cloud CLI 提交任务包：

   ```
   deadline bundle submit {{my-job-bundle}}
   ```

1. 要验证分块是否生效，请在 Deadline Cloud 监视器中打开任务并查看该步骤的任务列表。每个任务代表一个区块并显示帧范围，例如`1-10`而不是单个帧号。

以下完整作业模板以 10 帧为单位呈现 Blender 动画：

```
specificationVersion: 'jobtemplate-2023-09'
extensions:
  - TASK_CHUNKING
name: Blender Render with Contiguous Chunking
parameterDefinitions:
  - name: BlenderSceneFile
    type: PATH
    objectType: FILE
    dataFlow: IN
  - name: Frames
    type: STRING
    default: "1-100"
  - name: OutputDir
    type: PATH
    objectType: DIRECTORY
    dataFlow: OUT
    default: "./output"
steps:
  - name: RenderBlender
    parameterSpace:
      taskParameterDefinitions:
        - name: Frame
          type: CHUNK[INT]
          range: "{{Param.Frames}}"
          chunks:
            defaultTaskCount: 10
            rangeConstraint: CONTIGUOUS
    script:
      actions:
        onRun:
          command: bash
          args: ["{{Task.File.Run}}"]
      embeddedFiles:
        - name: Run
          type: TEXT
          data: |
            set -xeuo pipefail
            
            mkdir -p '{{Param.OutputDir}}'
            
            # Parse the chunk range (e.g., "1-10") into start and end frames
            START_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f1)"
            END_FRAME="$(echo '{{Task.Param.Frame}}' | cut -d- -f2)"
            
            blender --background '{{Param.BlenderSceneFile}}' \
                    --render-output '{{Param.OutputDir}}/output_####' \
                    --render-format PNG \
                    --use-extension 1 \
                    -s "$START_FRAME" \
                    -e "$END_FRAME" \
                    --render-anim
```

在此示例中，Deadline Cloud 将 100 个帧分成多个区块，例如`1-10`和`11-20`，并且每项任务都通过一次调用 Blender 来渲染其数据块。

有关更多信息，请参阅以下主题：
+ [在 Deadline Cloud 上使用任务分块将帧分组为多个区块](examples-jb-task-chunking.md)— Ready-to-submit 分块样本，包括非连续变体。
+ [如何向 Deadline Cloud 提交作业](submit-jobs-how.md)— 将任务包提交到您的队列中。