| Crates.io | trtx-sys |
| lib.rs | trtx-sys |
| version | 0.2.0 |
| created_at | 2025-12-09 11:32:49.175588+00 |
| updated_at | 2025-12-10 07:44:24.920299+00 |
| description | Raw FFI bindings to NVIDIA TensorRT-RTX (EXPERIMENTAL - NOT FOR PRODUCTION) |
| homepage | |
| repository | https://github.com/tarekziade/trtx-rs |
| max_upload_size | |
| id | 1975324 |
| size | 58,040 |
⚠️ EXPERIMENTAL - NOT FOR PRODUCTION USE
This project is in early experimental development. The API is unstable and will change. This is NOT production-ready software. Use at your own risk.
Published on crates.io to reserve the crate names.
Safe Rust bindings to NVIDIA TensorRT-RTX for high-performance deep learning inference.
This project provides ergonomic Rust bindings to TensorRT-RTX, enabling efficient inference of deep learning models on NVIDIA GPUs with minimal overhead.
trtx-rs/
├── trtx-sys/ # Raw FFI bindings (unsafe)
└── trtx/ # Safe Rust wrapper (use this!)
Set the installation path if TensorRT-RTX is not in a standard location:
export TENSORRT_RTX_DIR=/path/to/tensorrt-rtx
export CUDA_ROOT=/usr/local/cuda
If you're developing on a machine without TensorRT-RTX (e.g., macOS, or for testing), you can use the mock feature:
# Build with mock mode
cargo build --features mock
# Run examples with mock mode
cargo run --features mock --example basic_workflow
# Run tests with mock mode
cargo test --features mock
Mock mode provides stub implementations that allow you to:
Note: Mock mode only validates structure and API usage. For actual inference, you need real TensorRT-RTX.
Add to your Cargo.toml:
[dependencies]
trtx = "0.1"
use trtx::{Logger, Builder};
use trtx::builder::{network_flags, MemoryPoolType};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create logger
let logger = Logger::stderr()?;
// Create builder
let builder = Builder::new(&logger)?;
// Create network with explicit batch dimensions
let network = builder.create_network(network_flags::EXPLICIT_BATCH)?;
// Configure builder
let mut config = builder.create_config()?;
config.set_memory_pool_limit(MemoryPoolType::Workspace, 1 << 30)?; // 1GB
// Build serialized engine
let engine_data = builder.build_serialized_network(&network, &config)?;
// Save to disk
std::fs::write("model.engine", &engine_data)?;
Ok(())
}
use trtx::{Logger, Runtime};
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create logger and runtime
let logger = Logger::stderr()?;
let runtime = Runtime::new(&logger)?;
// Load serialized engine
let engine_data = fs::read("model.engine")?;
let engine = runtime.deserialize_cuda_engine(&engine_data)?;
// Create execution context
let mut context = engine.create_execution_context()?;
// Query tensor information
let num_tensors = engine.get_nb_io_tensors()?;
for i in 0..num_tensors {
let name = engine.get_tensor_name(i)?;
println!("Tensor {}: {}", i, name);
}
// Set tensor addresses (requires CUDA memory)
unsafe {
context.set_tensor_address("input", input_device_ptr)?;
context.set_tensor_address("output", output_device_ptr)?;
}
// Execute inference
unsafe {
context.enqueue_v3(cuda_stream)?;
}
Ok(())
}
use trtx::{Logger, LogHandler, Severity};
struct MyLogger;
impl LogHandler for MyLogger {
fn log(&self, severity: Severity, message: &str) {
match severity {
Severity::Error | Severity::InternalError => {
eprintln!("ERROR: {}", message);
}
Severity::Warning => {
println!("WARN: {}", message);
}
_ => {
println!("INFO: {}", message);
}
}
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let logger = Logger::new(MyLogger)?;
// Use logger...
Ok(())
}
Logger: Captures TensorRT messages with custom handlersBuilder: Creates optimized inference enginesNetworkDefinition: Defines the computational graphBuilderConfig: Configures optimization parametersRuntime: Deserializes engines for inferenceCudaEngine: Optimized inference engineExecutionContext: Manages inference executionAll fallible operations return Result<T, Error>:
use trtx::Error;
match builder.create_network(0) {
Ok(network) => {
// Use network
}
Err(Error::InvalidArgument(msg)) => {
eprintln!("Invalid argument: {}", msg);
}
Err(e) => {
eprintln!("Error: {}", e);
}
}
Most operations are safe and use RAII for resource management:
CUDA-related operations require unsafe:
set_tensor_address: Must point to valid CUDA device memoryenqueue_v3: Requires valid CUDA stream and properly bound tensors# Clone the repository
git clone https://github.com/yourusername/trtx-rs.git
cd trtx-rs
# Option 1: Build with TensorRT-RTX (requires NVIDIA GPU)
export TENSORRT_RTX_DIR=/path/to/tensorrt-rtx
cargo build --release
cargo test
# Option 2: Build in mock mode (no GPU required)
cargo build --features mock --release
cargo test --features mock
cargo run --features mock --example basic_workflow
See the trtx/examples/ directory for complete examples:
basic_build.rs: Building an engine from scratchinference.rs: Running inference with a pre-built enginebindgen-generated bindingsCannot find TensorRT headers:
export TENSORRT_RTX_DIR=/path/to/tensorrt-rtx
Linking errors:
export LD_LIBRARY_PATH=$TENSORRT_RTX_DIR/lib:$LD_LIBRARY_PATH
CUDA not initialized: Ensure CUDA runtime is properly initialized before creating engines or contexts.
Invalid tensor addresses: Verify that all tensor addresses point to valid CUDA device memory with correct sizes.
To ensure code quality, set up the pre-commit hook:
cp .githooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
The hook will automatically run cargo fmt and cargo clippy before each commit.
You can also run checks manually using the Makefile:
make check-all # Run fmt, clippy, and tests
make fmt # Format code
make clippy # Run lints
make test # Run tests
The project includes CI workflows for testing with real NVIDIA GPUs:
To set up a GPU runner for real hardware testing, see GPU Runner Setup Guide.
The GPU tests workflow:
Contributions are welcome! Please see DESIGN.md for architecture details.
This project is licensed under either of:
at your option.
This project is in early development. APIs may change before 1.0 release.