资源下载器#
目前,我们为 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 如何上传资源的示例
将
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}")
将文件从本地计算机复制到 Pod 中的
DESTINATION_RESOURCE_PATH
。
cd <your-local-directory> kubectl cp . -c init -n <your-namespace> <your-pod-name>:$DESTINATION_RESOURCE_PATH
验证文件是否在那里。
kubectl exec -n <your-namespace> -c init <your-pod-name> -- ls -alh $DESTINATION_RESOURCE_PATH
在
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
然后,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