- Platform Detection
- Model Export
- Inference Runtime
- Benchmarking
- Quantization
- Calibration Data
- Report Generation
- System Monitoring
Detect current platform and hardware capabilities.
from rl_deploy_bench.utils.platform import detect_platform, get_monitor_backend
info = detect_platform()
print(f"OS: {info.os}, GPU: {info.gpu_name}")
backend = get_monitor_backend(info) # 'nvidia', 'jetson', or 'cpu'PlatformInfo fields:
os: Operating system namearch: Architecture (e.g., 'AMD64', 'aarch64')python_version: Python version stringhas_nvidia_gpu: Booleanis_jetson: Booleangpu_name: GPU model name (if available)gpu_count: Number of GPUscpu_count: Number of CPU corestotal_memory_gb: Total system memory in GB
export_to_onnx(policy, observation_shape, output_path, config=None, action_low=None, action_high=None) -> str
Export a generic PyTorch policy to ONNX format.
from rl_deploy_bench.exporter import export_to_onnx, ExportConfig
config = ExportConfig(opset_version=17, dynamic_batch=True)
onnx_path = export_to_onnx(
policy, observation_shape=(4,), output_path="model.onnx", config=config
)Export a Stable Baselines3 model to ONNX.
from rl_deploy_bench.exporter import export_sb3_model, load_sb3_model
model = load_sb3_model("ppo_model.zip", algo="PPO")
onnx_path = export_sb3_model(model, "ppo.onnx")Verify that ONNX export matches PyTorch output.
Returns: {"passed": bool, "max_abs_diff": float, "mean_abs_diff": float, ...}
ONNX Runtime inference engine.
from rl_deploy_bench.runtime import OnnxRuntimeInference
inference = OnnxRuntimeInference("model.onnx")
result = inference.infer(observation) # InferenceResult(actions, latency_ms)
inference.warmup(num_runs=10)Methods:
infer(observation) -> InferenceResult: Run single inferenceinfer_batch(observations) -> InferenceResult: Run batch inferencewarmup(num_runs=10, observation_shape=None): Warm up the sessionget_provider_info() -> dict: Get active provider info
TensorRT inference engine (requires TensorRT installation).
from rl_deploy_bench.runtime import TensorRTEngine, TensorRTConfig, is_tensorrt_available
if is_tensorrt_available():
engine = TensorRTEngine()
engine.build_from_onnx("model.onnx", "model.engine", precision="fp16")
actions, latency = engine.infer(observation)benchmark_latency(inference, observation_shape, num_warmup=50, num_runs=500, batch_size=1, monitor=None) -> BenchmarkResult
Run latency and throughput benchmark.
from rl_deploy_bench.benchmark import benchmark_latency
result = benchmark_latency(inference, observation_shape=(4,), num_runs=500)
print(f"P95: {result.latency.p95_ms:.3f} ms")
print(f"Throughput: {result.latency.throughput_fps:.1f} FPS")LatencyStats fields:
mean_ms,std_ms,min_ms,max_msp50_ms,p90_ms,p95_ms,p99_msthroughput_fpslatencies_ms: List of all latency measurements
Compare actions from original vs deployed model (RL-specific metrics).
from rl_deploy_bench.benchmark import compare_actions
result = compare_actions(original_actions, quantized_actions)
print(f"Action MSE: {result.action_mse:.8f}")
print(f"Cosine similarity: {result.action_cosine_similarity:.6f}")AccuracyComparisonResult fields:
action_mse,action_mae,action_max_erroraction_cosine_similarity,action_relative_errorper_dimension_mse: List of per-dimension MSE values
Apply dynamic INT8 quantization (no calibration needed).
from rl_deploy_bench.quantizer import dynamic_quantize
quantized_path = dynamic_quantize("model.onnx")static_quantize_with_dataset(onnx_model_path, calibration_dataset, output_path=None, config=None, input_name="observation") -> str
Apply static INT8 quantization with calibration data from a CalibrationDataset.
from rl_deploy_bench.quantizer import static_quantize_with_dataset
quantized_path = static_quantize_with_dataset(
"model.onnx", calibration_dataset, input_name="observation"
)evaluate_quantization(original_model_path, quantized_model_path, observation_shape, num_samples=500, mse_threshold=0.01) -> dict
Evaluate quantization impact with automated recommendation.
from rl_deploy_bench.quantizer import evaluate_quantization
result = evaluate_quantization("model.onnx", "model_int8.onnx", observation_shape=(4,))
print(f"Verdict: {result['verdict']}") # 'pass', 'caution', or 'fail'
print(f"Recommendation: {result['recommendation']}")quantize_and_evaluate(onnx_model_path, observation_shape, mode="dynamic", calibration_dataset=None) -> dict
One-click quantization and evaluation.
Generate calibration data from a Gymnasium environment.
from rl_deploy_bench.benchmark import (
EnvironmentCalibrationGenerator, CalibrationConfig
)
config = CalibrationConfig(num_samples=500, collection_strategy="policy")
generator = EnvironmentCalibrationGenerator("Pendulum-v1", policy=policy_fn, config=config)
dataset = generator.generate()
dataset.save("calibration.npz")Calibration generator using a Stable Baselines3 trained policy.
Dataset of calibration observations with save/load support.
from rl_deploy_bench.benchmark import CalibrationDataset
dataset = CalibrationDataset.load("calibration.npz")
stats = dataset.get_statistics()Methods:
save(path) -> str: Save to .npzload(path) -> CalibrationDataset: Class method to loadget_statistics() -> dict: Get dataset statistics
generate_markdown_report(output_path, benchmark_results, model_names, accuracy_results=None, model_paths=None, platform_info=None, title="...") -> str
Generate a Markdown benchmark report.
from rl_deploy_bench.reporter import generate_markdown_report
report_path = generate_markdown_report(
"report.md",
[fp32_result, int8_result],
["FP32", "INT8"],
accuracy_results=[None, int8_accuracy],
platform_info=platform_info,
)generate_html_report(output_path, benchmark_results, model_names, accuracy_results=None, platform_info=None, title="...") -> str
Generate an interactive HTML report with Plotly charts.
Create the appropriate monitor for the current platform (auto-detected).
from rl_deploy_bench.monitor import create_monitor
monitor = create_monitor() # Auto-detects NVIDIA GPU, Jetson, or CPU
with monitor:
# run benchmark
snapshot = monitor.snapshot() # SystemMetricsMonitor implementations:
NvidiaGPUMonitor: Uses pynvml for x86 NVIDIA GPUsJetsonMonitor: Uses jetson-stats for NVIDIA JetsonCPUMonitor: Uses psutil for CPU-only systems
SystemMetrics fields:
gpu_utilization,gpu_memory_used_mb,gpu_memory_total_mbgpu_power_w,gpu_temperature_ccpu_utilization,cpu_memory_used_mb,cpu_memory_total_mb
# Show platform info
rl-deploy-bench info
# Export SB3 model
rl-deploy-bench export model.zip --output model.onnx --algo PPO
# Quantize
rl-deploy-bench quantize model.onnx --mode dynamic
# Benchmark
rl-deploy-bench benchmark model.onnx --obs-shape 4 --num-runs 500 --output report.md
# Compare FP32 vs INT8
rl-deploy-bench compare model.onnx model_int8.onnx --obs-shape 4 --output comparison.html