资源下载器#

目前,我们为 NGC 和手动上传提供了两个资源下载器 init 容器。这些容器允许您将资源文件(例如头像 USD 场景或 Unreal 项目)下载到微服务 Pod 的持久卷上。或者,您可以选择创建自己的 init 容器,以从任何远程存储下载资源。

NGC 资源下载器#

NGC 是 NVIDIA 文件存储系统。ngc-resource-downloader init 容器将从 NGC 下载资源。为此,可以使用资源下载器在微服务的 params 部分中提供一个或多个 NGC 资源路径。

如果需要,可以使用包含 NGC API 密钥的密钥来访问 NGC 上的受限内容。

# Single resource example (remoteResourcePath is a string)
resourceDownload:
  remoteResourcePath: nvidia/ace/default-avatar-scene:1.0.0
  secretName: ngc-api-key-secret
  image: nvcr.io/nvidia/ace/ngc-resource-downloader:1.1.4

# Multi resources example (remoteResourcePath is a map)
resourceDownload:
  remoteResourcePath:
    unrealEngineProject: "your-org/your-team/ia-unreal-renderer-asset-metahuman-example:0.1.0"
    metahumanPak: "your-org/your-team/ia-unreal-renderer-asset-metahuman-configuration-example:0.1.0"
    scenePak: "your-org/your-team/ia-unreal-renderer-asset-scene-configuration-example:0.1.0"
  secretName: ngc-api-key-secret
  image: nvcr.io/nvidia/ace/ngc-resource-downloader:1.1.4

在部署 UCS 应用程序之前,您必须创建一个 Kubernetes 密钥。secret.yaml 配置应如下面的代码片段所示。

apiVersion: v1
data:
  NGC_CLI_API_KEY: "******"
kind: Secret
metadata:
  name: ngc-api-key-secret
  namespace: animation-pipeline
type: Opaque

或者,当从 docker 运行时,远程资源路径可以通过 ENV 变量提供。

# Single resource example (remoteResourcePath is a string)
REMOTE_RESOURCE_PATH=nvidia/ace/default-avatar-scene:1.0.0
# Multi resources example (remoteResourcePath is a map)
REMOTE_RESOURCE_PATH="{'unrealEngineProject': 'your-org/your-team/ia-unreal-renderer-asset-metahuman-example:0.1.0', 'metahumanPak': 'your-org/your-team/ia-unreal-renderer-asset-metahuman-configuration-example:0.1.0', 'scenePak': 'your-org/your-team/ia-unreal-renderer-asset-scene-configuration-example:0.1.0'}"

$ docker run --rm --name ngc_resource_downloader -v /path/to/your/resource/folder:/mnt/resources -e DESTINATION_RESOURCE_PATH=/mnt/resources -e REMOTE_RESOURCE_PATH=$REMOTE_RESOURCE_PATH -e NGC_CLI_API_KEY=$NGC_CLI_API_KEY nvcr.io/nvidia/ace/ngc-resource-downloader:1.1.4

先决条件#

在将资产上传到 NGC 空间之前,您必须下载并安装 NGC CLI

此外,请确保您有权访问 NGC,并且您知道您要将资产上传到的 <ORG><TEAM>。如果您无权访问 NGC,请联系您的 NVIDIA 联系人或 NVIDIA 支持,或使用其他下载方法。

在 NGC 中为资产创建资源#

使用以下命令为您的资产创建名为 <RESOURCE_NAME> 的新资源

ngc registry resource create <ORG>/<TEAM>/<RESOURCE_NAME> --application OTHER --framework Other --format usda --precision Other --short-desc "Scene asset files for ACE"

例如,要在 <ORG> (your-org-name)、<TEAM> (your-ngc-team)、<RESOURCE_NAME> (avatar_scene) 中创建资源,请使用

ngc registry resource create your-org-name/your-ngc-team/avatar_scene --application OTHER --framework Other --format usda --precision Other --short-desc "Scene asset files for ACE"

将版本上传到 NGC 资源#

要将版本(例如 1)上传到资源,请确保资产文件位于单个本地文件夹中,例如 Avatar Configurator 创建的 /exported 目录,包括场景文件 Avatar_Scene.usd 和所有依赖项(如纹理)。

要上传资源文件,请将本地 <folder> 的路径作为参数提供给以下命令

ngc registry resource upload-version your-org-name/your-ngc-team/avatar_scene:1 --source <folder>

要下载资源,请使用

ngc registry resource download-version "your-org-name/your-ngc-team/avatar_scene:1"

要删除版本,请使用

ngc registry resource remove your-org-name/your-ngc-team/avatar_scene:1

手动资源下载器#

manual-resource-downloader init 容器会等待资源手动上传到持久卷。资源需要上传到环境变量 DESTINATION_RESOURCE_PATH=<persistent-volume-mount-path> 中传递的路径。资源上传完成后,通过添加名为 manual_resource_uploaded.txt 的文件来确认。

在 UCS 应用程序的 params 中,无需提供资源路径,因为上传是完全手动的。需要提供密钥,即使不使用它也是如此。在这种情况下,只需创建一个空的 dummy-secret

resourceDownload:
  remoteResourcePath: ""
  secretName: dummy-secret
  image: nvcr.io/nvidia/ace/manual-resource-downloader:1.0.1

以下是使用 kubectl 如何上传资源的示例

  1. DESTINATION_RESOURCE_PATH 环境变量获取到您的本地计算机。

DESTINATION_RESOURCE_PATH=$(kubectl get pod -n <your-namespace> <your-pod-name> -o jsonpath="{.spec.initContainers[?(@.name=='init')].env[?(@.name=='DESTINATION_RESOURCE_PATH')].value}")
  1. 将文件从本地计算机复制到 Pod 中的 DESTINATION_RESOURCE_PATH

cd <your-local-directory>
kubectl cp . -c init -n <your-namespace> <your-pod-name>:$DESTINATION_RESOURCE_PATH
  1. 验证文件是否在那里。

kubectl exec -n <your-namespace> -c init <your-pod-name> -- ls -alh $DESTINATION_RESOURCE_PATH
  1. DESTINATION_RESOURCE_PATH 中创建一个名为 manual_resource_uploaded.txt 的文件,以确认上传成功。

kubectl exec -n <your-namespace> -c init <your-pod-name> -- touch $DESTINATION_RESOURCE_PATH/manual_resource_uploaded.txt
  1. 然后,init 容器将完成,微服务将启动。

创建您自己的资源下载器#

要创建您自己的 init 容器以从任何您想要的位置下载资源,您只需在工作目录中提供一个 download_resource.sh

然后,UCS 应用程序将使用您的 init 容器来下载资源。

  • remoteResourcePath 可用作 REMOTE_RESOURCE_PATH 环境变量。请注意,如果提供单个资源路径,则环境变量将是一个包含资源路径的字符串,而当提供多个路径时,环境变量值将是以下形式的映射:{'myFirstResource': 'my-first-resource-path', 'mySecondResource': 'my-second-resource-path', 'myThirdResource': 'my-third-resource-path'}

  • 持久卷的挂载路径可用作 DESTINATION_RESOURCE_PATH 环境变量。在提供多个资源路径的情况下,每个资源都应下载到以资源键命名的子目录中(例如 myFirstResource)。

  • 密钥中的值可用作环境变量,与密钥中声明的完全相同。

以下是 UCS manifest.yaml 中使用资源下载器的微服务的摘录,用于说明目的。

image: "(($params.resourceDownload.image))"
imagePullPolicy: IfNotPresent
env:
  - name: REMOTE_RESOURCE_PATH
    value: "(($params.resourceDownload.remoteResourcePath))"
  - name: DESTINATION_RESOURCE_PATH
    value: "{{ .persistentVolume.mountPath }}"
envFrom:
  - secretRef:
      name: "(($params.resourceDownload.secretName))"
command: ["/bin/bash", "download_resource.sh"]

您的 dockerfile 可能如下所示。在 download_resource.sh 中,您可以自由编写资源下载脚本。

FROM ubuntu:22.04
WORKDIR /home/my-user
COPY download_resource.sh .
ENTRYPOINT ["/bin/bash", "download_resource.sh"]

以下示例说明了如何将您自己的 init 容器作为 params 添加到 UCS 应用程序。

# Single resource example (remoteResourcePath is a string)
resourceDownload:
  remoteResourcePath: my-resource-path
  secretName: my-secret
  image: my-resource-downloader:1.2.3

# Multi resources example (remoteResourcePath is a map)
resourceDownload:
  remoteResourcePath:
    myFirstResource: my-first-resource-path
    mySecondResource: my-second-resource-path
    myThirdResource: my-third-resource-path
  secretName: my-secret
  image: my-resource-downloader:1.2.3