
Upscale encoded or ST 2110 video to higher resolutions with NVIDIA Video Super Resolution.
Follow the steps below to download and run the NVIDIA NIM inference microservice for this model on your infrastructure of choice.
This guide covers VSR NIM ST 2110 deployments on NVIDIA Holoscan for Media.
Before deploying VSR NIM for ST 2110, verify that your platform meets these requirements:
kubectl or oc access to the target cluster.NetworkAttachmentDefinition resources for ST 2110 media traffic in the
workload namespace.allowPrivilegeEscalation: true and the IPC_LOCK, NET_RAW, SYS_NICE,
and DAC_READ_SEARCH Linux capabilities to the service accounts used by the
workloads.topologyManagerPolicy: single-numa-node.For complete platform setup, see the NVIDIA Holoscan for Media user guide and the VSR NIM ST 2110 support matrix.
Generate an NGC API key from NGC API Keys. When creating a personal key, select at least NGC Catalog from the Services Included dropdown.
Export the key and log in to the NGC Helm registry:
export NGC_API_KEY=<value>
printf "%s" "$NGC_API_KEY" | helm registry login nvcr.io \
--username '$oauthtoken' \
--password-stdin
Create an image pull secret in the workload namespace when the kubelet does not already have registry credentials:
kubectl create secret docker-registry <secret-name> \
--docker-server=nvcr.io \
'--docker-username=$oauthtoken' \
--docker-password=<NGC-API-KEY> \
--docker-email=<your-email> \
-n <namespace>
On Red Hat OpenShift, replace kubectl with oc.
Rivermax is required for SMPTE ST 2110 streaming. When the license file is available, create a Kubernetes secret in the workload namespace:
kubectl create secret generic rivermax-license \
--from-file=rivermax.lic \
-n <namespace>
VSR NIM receives and transmits ST 2110 traffic, so the media function pod uses both input-side and output-side network attachments. The sample defaults are:
media-a-rx-net
media-a-tx-net
NetworkAttachmentDefinition resources are namespace-scoped. If the required
attachments exist in another namespace, copy them into the workload namespace
before deploying.
On OpenShift clusters, bind an SCC that allows the required ST 2110 security
context to each service account used by the sender, VSR NIM, and receiver pods.
For development and evaluation, the built-in privileged SCC can be bound to
the deployment namespace:
oc adm policy add-scc-to-user privileged -z default -n <namespace>
For production, prefer a least-privilege SCC that grants only
allowPrivilegeEscalation: true and the required Linux capabilities.
Use the production NGC org and team that host the VSR NIM H4M charts:
ngc config set
ngc registry chart pull nim/nvidia/nvidia-vsr-nim-h4m-service:1.0.10
ngc registry chart pull nim/nvidia/nvidia-vsr-nim-h4m-sample:1.0.10
Verify that the downloaded sample archive is the umbrella sample chart, not the service-only chart:
helm show chart nvidia-vsr-nim-h4m-sample-1.0.10.tgz | grep '^name: nvidia-vsr-nim-h4m-sample$'
The H4M VSR NIM service image for this release is:
nvcr.io/nim/nvidia/vsr-h4m-nim:1.0.10
VSR NIM ST 2110 deployment provides two Helm chart paths:
nvidia-vsr-nim-h4m-service: VSR NIM media function only, for integration
with existing ST 2110 endpoints.nvidia-vsr-nim-h4m-sample: end-to-end sample pipeline with sender, VSR NIM
service, and receiver.Use the service chart when upstream and downstream ST 2110 endpoints are deployed separately. Use the sample chart when you want a packaged sender to VSR NIM to receiver pipeline for validation. The sample sender generates a live SMPTE color bars test pattern by default and requires no input asset.
Extract the service values:
tar xzf nvidia-vsr-nim-h4m-service-1.0.10.tgz \
nvidia-vsr-nim-h4m-service/values-nmos.yaml \
nvidia-vsr-nim-h4m-service/values-st2110.yaml
Deploy the service chart in NMOS mode:
helm upgrade --install vsr-nim-service \
nvidia-vsr-nim-h4m-service-1.0.10.tgz \
-f nvidia-vsr-nim-h4m-service/values-nmos.yaml \
--set nodeSelector.hostname=<node-hostname>
Deploy the service chart in static ST 2110 mode:
helm upgrade --install vsr-nim-service \
nvidia-vsr-nim-h4m-service-1.0.10.tgz \
-f nvidia-vsr-nim-h4m-service/values-st2110.yaml \
--set nodeSelector.hostname=<node-hostname>
If the kubelet does not already have registry credentials, set the VSR NIM service image pull secret:
--set image.secret=<secret-name>
For clusters without topo-aware-scheduler, clear the scheduler name:
helm upgrade --install vsr-nim-service \
nvidia-vsr-nim-h4m-service-1.0.10.tgz \
-f nvidia-vsr-nim-h4m-service/values-nmos.yaml \
--set schedulerName="" \
--set nodeSelector.hostname=<node-hostname>
Extract the sample values:
tar xzf nvidia-vsr-nim-h4m-sample-1.0.10.tgz \
nvidia-vsr-nim-h4m-sample/values.yaml \
nvidia-vsr-nim-h4m-sample/values-nmos.yaml \
nvidia-vsr-nim-h4m-sample/values-st2110.yaml
Deploy the sample pipeline in NMOS mode:
helm upgrade --install vsr-nim-h4m \
nvidia-vsr-nim-h4m-sample-1.0.10.tgz \
-f nvidia-vsr-nim-h4m-sample/values-nmos.yaml \
--set sender.enabled=true \
--set receiver.enabled=true \
--set nvidia-vsr-nim-h4m-service.enabled=true \
--set sender.nodeSelector.hostname=<node-hostname> \
--set receiver.nodeSelector.hostname=<node-hostname> \
--set nvidia-vsr-nim-h4m-service.nodeSelector.hostname=<node-hostname>
Deploy the sample pipeline in static ST 2110 mode:
helm upgrade --install vsr-nim-h4m \
nvidia-vsr-nim-h4m-sample-1.0.10.tgz \
-f nvidia-vsr-nim-h4m-sample/values-st2110.yaml \
--set sender.enabled=true \
--set receiver.enabled=true \
--set nvidia-vsr-nim-h4m-service.enabled=true \
--set sender.nodeSelector.hostname=<node-hostname> \
--set receiver.nodeSelector.hostname=<node-hostname> \
--set nvidia-vsr-nim-h4m-service.nodeSelector.hostname=<node-hostname>
For the sample chart, set image pull secrets as needed:
--set nvidia-vsr-nim-h4m-service.image.secret=<secret-name>
--set sender.image.secret=<secret-name>
--set receiver.image.secret=<secret-name>
For clusters without topo-aware-scheduler, clear both sample-chart scheduler
settings:
--set h4m.schedulerName="" \
--set nvidia-vsr-nim-h4m-service.schedulerName=""
Set site-specific values for node selection, image pull secrets, network attachment names, SR-IOV pool resources, multicast groups, ports, packet sizes, and Rivermax secret names before production use. On clusters where VSR input and output media interfaces must use the same SR-IOV pool, configure both VSR interfaces and pool counts explicitly; do not collapse separate RX and TX pools unless the cluster exposes one shared pool.
In NMOS mode, use DNS-SD registration by default. If DNS-SD is unavailable,
set nmos.registrationUrl for each component to the NMOS IS-04 registration
endpoint and verify that the VSR NIM image registers correctly before relying
on this mode for NMOS Connection Manager workflows.
For NMOS validation, deploy the receiver and VSR NIM first, wait for both pods to become ready, and then enable the sender. This avoids filling the VSR output queue before the downstream receiver is connected.
The Holoscan for Media operator for VSR NIM manages the VSR NIM media function
through a NvidiaVsrNimMediaFunction custom resource. The operator manages
only the VSR NIM media function; source and receiver endpoints must be provided
by existing ST 2110 equipment, platform services, or the sample Helm chart with
its VSR service disabled.
Pull the operator chart:
ngc registry chart pull nim/nvidia/nvidia-vsr-nim-h4m-operator:1.0.10
Install the operator:
helm upgrade --install vsr-nim-operator \
nvidia-vsr-nim-h4m-operator-1.0.10.tgz \
-n <operator-namespace> \
--create-namespace
If the operator image requires a pull secret, set it in the operator chart values:
--set imagePullSecrets[0].name=<secret-name>
If generated media function pods should use a default pull secret when the CR
omits spec.parameters.imagePullSecrets, set it separately:
--set mediaFunction.imagePullSecrets[0].name=<secret-name>
Wait for the operator:
kubectl rollout status deployment \
-n <operator-namespace> \
-l app.kubernetes.io/instance=vsr-nim-operator \
--timeout=180s
Create a NvidiaVsrNimMediaFunction custom resource to define one ST 2110-20
video input, one ST 2110-20 video output, NMOS or inline SDP control, VSR
processing parameters, GPU resources, high-speed network attachments, Rivermax,
logging, security, resources, and scheduler settings. Use
transfer_characteristic: SDR for SDP generation in this release.
Check deployments and pods:
kubectl get deploy -n <namespace>
kubectl get pods -n <namespace>
kubectl rollout status deployment/<deployment-name> -n <namespace> --timeout=300s
kubectl logs deployment/<deployment-name> -n <namespace> --tail=100
Check the operator-managed custom resource:
kubectl get nvidiavsrnimmediafunction -n <namespace>
kubectl describe nvidiavsrnimmediafunction <cr-name> -n <namespace>
In NMOS mode, connect the sender, VSR NIM media function, and receiver through the NMOS Controller UI. Connect the VSR NIM output to the receiver before connecting the sender to the VSR NIM input. In static ST 2110 mode, the chart self-activates from the configured transport values.
When using the sample receiver, copy the output file from the receiver pod:
kubectl cp -n <namespace> <receiver-pod>:/workspace/recv_4k_h264.ts ./out.ts
ffprobe ./out.ts
The sample pipeline is expected to produce a 4Kp30 H.264 MPEG-TS output file from the receiver. The ST 2110 output over the wire is UYVP / YCbCr 4:2:2 10-bit video; the saved receiver artifact is encoded as H.264 High, yuv420p, 8-bit.
For complete deployment, configuration, NMOS, static ST 2110, operator, and verification details, see the VSR NIM ST 2110 documentation.