Basic Inference#
Perform a health check on the gRPC endpoint.
Install
grpcurlfrom github.com/fullstorydev/grpcurl/releases.Example commands to run on Ubuntu:
wget https://github.com/fullstorydev/grpcurl/releases/download/v1.9.1/grpcurl_1.9.1_linux_amd64.deb sudo dpkg -i grpcurl_1.9.1_linux_amd64.deb
Download the health checking proto:
wget https://raw.githubusercontent.com/grpc/grpc/master/src/proto/grpc/health/v1/health.protoRun the health check:
grpcurl --plaintext --proto health.proto localhost:8001 grpc.health.v1.Health/Check
If the service is ready, you get a response similar to the following:
{ "status": "SERVING" }
Note
For using grpcurl with an SSL-enabled server, avoid using the
--plaintextargument, and use--cacertwith a CA certificate,--keywith a private key, or--certwith a certificate file. For more details, refer togrpcurl --help.Download the Relighting client code by cloning the gRPC client repository (NVIDIA-Maxine/nim-clients):
git clone https://github.com/NVIDIA-Maxine/nim-clients.git # Go to the 'relighting' folder cd nim-clients/relighting/
For the Python client, install the required dependencies:
# Install Python on Linux sudo apt-get install python3-pip pip install -r requirements.txt
Compile the Protos (Optional)#
If you want to use the client code provided in the AI for Media NIM clients GitHub repository (NVIDIA-Maxine/nim-clients), you can skip this step.
The proto files are available in the relighting/protos folder. You can compile them to generate client interfaces in your preferred programming language. For more details, refer to Supported languages in the gRPC documentation.
The following example shows how to compile the protos for Python and Node.js on Linux and Windows.
Python#
The grpcio version needed for compilation can be referred from requirements.txt
To compile protos on Linux, run the following commands:
cd relighting/protos/linux/
chmod +x compile_protos.sh
./compile_protos.sh
To compile protos on Windows, run the following commands:
cd relighting/protos/windows/
./compile_protos.bat
Running Inference via Python Script#
You can use the sample client script in the Relighting GitHub repo to send a gRPC request to the hosted NIM server:
Go to the Python scripts directory.
cd scripts
Run the command to send a gRPC request. (All command-line parameters are optional.)
python relighting.py --target <server_ip:port> --video-input <input video file path> --output <output file path and the file name> --hdri-id <hdr preset id> --ssl-mode <ssl mode value> --ssl-key <ssl key file path> --ssl-cert <ssl cert filepath> --ssl-root-cert <ssl root cert filepath>
The Relighting NIM supports both streaming and transactional modes. The server automatically selects the appropriate mode based on whether the input video is streamable (indicated by metadata at the start of the file). Streamable inputs are preferred for large files. For more information, see Input Modes.
python relighting.py --target <server_ip:port> --video-input <streamable input video file path> --output <output file path and the file name> --hdri-id <hdr preset id>
Note
The first inference is not indicative of the model’s actual performance because it includes the time taken by the Triton Inference Server to load the models for the first time. The subsequent inference requests reflect the actual processing performance.
For Blackwell GPUs, the initial inference might time out because of the time needed to load the models. If timeout occurs, send another request; subsequent inferences reflect the actual processing performance.
To view details of command-line arguments, run the following command:
python relighting.py -h
You get a response similar to the following:
usage: relighting.py [-h] [--ssl-mode {DISABLED,MTLS,TLS}] [--ssl-key SSL_KEY] [--ssl-cert SSL_CERT] [--ssl-root-cert SSL_ROOT_CERT] [--target TARGET] [--video-input VIDEO_INPUT]
[--output OUTPUT] [--bitrate BITRATE] [--idr-interval IDR_INTERVAL] [--lossless] [--custom-encoding-params CUSTOM_ENCODING_PARAMS] [--benchmark-grpc]
[--hdr HDR_FILE] [--hdri-id {0,1,2,3,4}] [--pan PAN] [--vfov VFOV] [--autorotate] [--rotation-rate ROTATION_RATE]
[--background-source {0,1,2}] [--background-image BACKGROUND_IMAGE] [--background-image-type {0,1,2}] [--background-color BACKGROUND_COLOR]
[--foreground-gain FOREGROUND_GAIN] [--background-gain BACKGROUND_GAIN] [--blur BLUR] [--specular SPECULAR]
Run AI for Media Relighting with all available features
options:
-h, --help show this help message and exit
SSL:
--ssl-mode {DISABLED,MTLS,TLS} Flag to set SSL mode, default is DISABLED (default: DISABLED)
--ssl-key SSL_KEY The path to ssl private key. (default: ../ssl_key/ssl_key_client.pem)
--ssl-cert SSL_CERT The path to ssl certificate chain. (default: ../ssl_key/ssl_cert_client.pem)
--ssl-root-cert SSL_ROOT_CERT The path to ssl root certificate. (default: ../ssl_key/ssl_ca_cert.pem)
--target TARGET IP:port of gRPC service, when hosted locally. (default: 127.0.0.1:8001)
Input/Output:
--video-input VIDEO_INPUT Path to the input video file. (default: assets/sample_video.mp4)
--output OUTPUT Path for the output video file. (default: None)
--bitrate BITRATE Output video bitrate in bps. 0 = auto. (default: 10000000)
--idr-interval IDR_INTERVAL IDR interval in frames (server auto ~2 s GOP if omitted in API). (default: 8)
--lossless Enable lossless video encoding. (default: False)
--custom-encoding-params CUSTOM_ENCODING_PARAMS Custom encoding parameters as JSON. (default: None)
--benchmark-grpc Measure gRPC roundtrip only (exclude disk read/write). (default: False)
HDR/Illumination:
--hdr HDR_FILE Custom .hdr file. (default: None)
--hdri-id {0,1,2,3,4} HDR preset: 0=Lounge, 1=Cobblestone Street Night, 2=Glasshouse Interior, 3=Little Paris Eiffel Tower, 4=Wooden Studio. (default: 0)
--pan PAN Pan angle (degrees). (default: -90.0)
--vfov VFOV Vertical FOV (degrees). (default: 60.0)
Autorotate:
--autorotate Auto-rotate the HDR environment. (default: False)
--rotation-rate ROTATION_RATE Rotation speed (degrees/s). (default: 20.0)
Background:
--background-source {0,1,2} 0=source video, 1=custom image, 2=HDR projection. (default: 0)
--background-image BACKGROUND_IMAGE Custom background image (PNG, JPG, or HDR). (default: None)
--background-image-type {0,1,2} Format hint: 0=auto-detect, 1=HDRI, 2=standard (PNG/JPG). Only relevant with --background-source=1. (default: None)
--background-color BACKGROUND_COLOR Solid color: 'gray' or hex '0xRRGGBB'. (default: None)
Effect Parameters:
--foreground-gain FOREGROUND_GAIN Foreground relighting strength 0.0-2.0 (default: 1.0)
--background-gain BACKGROUND_GAIN Background relighting strength 0.0-2.0 (default: 1.0)
--blur BLUR Background blur strength 0.0-1.0 (default: 0.0)
--specular SPECULAR Specular highlight intensity 0.0-2.0 (default: 0.0)
To get more information about how to run the client with these parameters, refer to the AI for Media NIM clients GitHub repository: NVIDIA-Maxine/nim-clients.
For more information about configuring advanced parameters such as bitrate, IDR interval, HDR settings, and background options, see Advanced Usage.
For command-line arguments that aren’t specified, the script uses the following default values.
Default Command-Line Arguments#
Argument |
Default Value |
|---|---|
|
|
|
|
|
None (auto: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example Commands#
Basic inference with default arguments:
python3 relighting.py --target 127.0.0.1:8001
Run inference with custom input file and HDR preset:
python relighting.py --target 127.0.0.1:8001 --video-input /path/to/video.mp4 --hdri-id 3
Run inference with a streamable video (server auto-selects streaming mode):
python relighting.py --target 127.0.0.1:8001 --video-input /path/to/streamable_video.mp4
Run inference with custom HDR file:
python relighting.py --target 127.0.0.1:8001 --video-input /path/to/video.mp4 --hdr /path/to/custom.hdr
Run inference with blurred background:
python relighting.py --target 127.0.0.1:8001 --video-input /path/to/video.mp4 --blur 0.5
Run inference with custom background image:
python relighting.py --target 127.0.0.1:8001 --video-input /path/to/video.mp4 --background-source 1 --background-image /path/to/bg.png
Supported Formats#
The supported format for input video is MP4 with H.264 video encoding.
Input Modes#
The Relighting NIM provides two modes for processing input files: streaming and transactional.
Aspect |
Streaming Mode |
Transactional Mode |
|---|---|---|
Data Storage |
Only frames being processed are temporarily copied in memory. |
Entire video and audio files are temporarily copied on disk. |
Processing Start |
NIM starts processing as soon as data chunk for first frame arrives. |
NIM waits to receive entire files before starting. |
Processing Timing |
Continuous processing without waiting for complete input. |
Processing begins after all data is received. |
Output Delivery |
Output frames are generated and returned immediately. |
Complete output video is returned to client after inference is finished for whole video. |
Streaming Mode#
Streaming mode is the recommended way to use Relighting NIM. It allows inference to begin without receiving the whole video from the client. It processes video frames incrementally, and inference begins as soon as the first frame of information is available. The output frames are streamed back to the client immediately after inference.
The NIM automatically detects streamable videos and enables streaming mode. This mode delivers the lowest latency, best resource efficiency, and scales well to large files.
Use streaming mode for the following use cases:
Best overall performance—the NIM is optimized for this path.
Streamable video inputs.
Applications that benefit from receiving output as it is generated, without waiting for the entire file to be uploaded.
Large video files that benefit from incremental processing and reduced disk I/O.
Streaming mode works with streamable videos in which metadata is positioned at the beginning of the file. The NIM automatically detects streamable videos and enables streaming mode. Videos that are not streamable can be easily converted to a streamable format.
To convert your video into a streamable video, use FFmpeg with the -movflags +faststart option:
ffmpeg -i input.mp4 -movflags +faststart -c copy output_streamable.mp4
You can then specify the streamable video as input to the NIM by using the --video-input parameter:
python relighting.py --target 127.0.0.1:8001 --video-input ../assets/sample_video_streamable.mp4
Transactional Mode#
In transactional mode, the entire video and audio files have to be received by the NIM before processing can begin. The NIM falls back to this mode when the input video is not streamable.
Transactional mode is suitable for the following use cases:
Videos that are not optimized for streaming (such as non-streamable MP4 files in which metadata is located at the end of the file, requiring the entire file to be downloaded before playback can begin).
Processing of small video and audio files for which streaming overhead is unnecessary.
Applications that can wait for complete processing before receiving output.
To run Relighting NIM in transactional mode, provide a non-streamable video as input:
python relighting.py --target 127.0.0.1:8001 --video-input ../assets/sample_video.mp4
Tip
For best performance, convert your videos to a streamable format so that the NIM can use streaming mode.