From a63a1fc611e60d34867870424f6ea77784ebec14 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Mon, 2 Feb 2026 16:33:48 -0800 Subject: [PATCH 1/7] wip --- src/opentau/scripts/export_to_onnx.py | 337 +++++++++++++++++--------- 1 file changed, 223 insertions(+), 114 deletions(-) diff --git a/src/opentau/scripts/export_to_onnx.py b/src/opentau/scripts/export_to_onnx.py index 6504c88..e934f88 100644 --- a/src/opentau/scripts/export_to_onnx.py +++ b/src/opentau/scripts/export_to_onnx.py @@ -12,16 +12,35 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""ONNX export script for PI0/PI05 policies. + +This script exports the VLA policy to ONNX format. Due to the complexity of the +PI05 model (text tokenization, autoregressive generation, variable-length loops), +we export only the core tensor operations with pre-computed tokens. + +The ONNX model accepts: +- Pre-tokenized language tokens (computed externally) +- Image tensors (already preprocessed) +- Optional noise tensor + +This allows the ONNX model to focus on the traceable neural network operations +while non-traceable operations (tokenization, state discretization) are handled +externally in Python. + +For large models (>2GB), the script automatically uses ONNX external data format +to store weights in a separate file, bypassing the protobuf 2GB limit. +""" + import logging from pathlib import Path import torch +from torch import Tensor from opentau.configs import parser from opentau.configs.train import TrainPipelineConfig from opentau.policies.factory import get_policy_class -from opentau.policies.pi0.modeling_pi0 import PI0Policy -from opentau.policies.pi05.modeling_pi05 import PI05Policy +from opentau.policies.pi05.modeling_pi05 import PI05Policy, resize_with_pad from opentau.utils.monkey_patch import ( torch_cumsum_patch, torch_full_patch, @@ -37,144 +56,234 @@ torch_pow_patch, ] -KEY_STATES = "key_states" -VALUE_STATES = "value_states" +class PI05OnnxWrapper(torch.nn.Module): + """ONNX-exportable wrapper for PI05 model. + + This wrapper takes pre-tokenized inputs and performs only the traceable + tensor operations. Non-traceable operations like tokenization and + state discretization must be done externally. -class InferenceWrapper(torch.nn.Module): - r"""Helper class to wrap the robot action decoder for ONNX export, - such that each input tensor is an individual argument to the `forward` method. + The wrapper: + 1. Takes pre-tokenized language tokens (computed externally) + 2. Processes images using PyTorch operations + 3. Runs the flow matching denoising with a fixed number of steps """ def __init__( - self, - decoder: PI0Policy | PI05Policy, - *, - prefix_pad_masks: torch.Tensor, - prefix_offsets: torch.Tensor, - num_cross_att_tokens: int, - layer_idx: int, + self, + policy: PI05Policy, ): + """Initialize the ONNX wrapper. + + Args: + policy: The PI05Policy to wrap. + num_cameras: Number of camera inputs. + """ super().__init__() - self.decoder = decoder - self.prefix_pad_masks = prefix_pad_masks - self.prefix_offsets = prefix_offsets - self.num_cross_att_tokens = num_cross_att_tokens - self.layer_idx = layer_idx - - def forward(self, key_states, value_states, state): - vlm_tokens = ( - { - self.layer_idx: { - KEY_STATES: key_states, - VALUE_STATES: value_states, - }, - }, - self.prefix_pad_masks, - self.prefix_offsets, - self.num_cross_att_tokens, - ) - observation = { - "state": state, - } - actions = self.decoder.sample_actions( - observation, - vlm_token_cache_override=vlm_tokens, + self.policy = policy + self.config = policy.config + + def _preprocess_images(self, images: list[Tensor]) -> tuple[list[Tensor], list[Tensor]]: + """Preprocess images for the model (pure PyTorch operations). + + Args: + images: List of image tensors, each of shape (batch, 3, H, W) in range [0, 1]. + + Returns: + Tuple of (processed_images, image_masks). + """ + processed_images = [] + img_masks = [] + + for img in images: + # Resize with padding if configured + if self.config.resize_imgs_with_padding is not None: + img = resize_with_pad(img, *self.config.resize_imgs_with_padding, pad_value=0) + + # Normalize from [0,1] to [-1,1] as expected by SigLIP + img = img * 2.0 - 1.0 + + bsize = img.shape[0] + device = img.device + mask = torch.ones(bsize, dtype=torch.bool, device=device) + + processed_images.append(img) + img_masks.append(mask) + + return processed_images, img_masks + + def forward( + self, + lang_tokens: Tensor, + lang_masks: Tensor, + noise: Tensor, + *images: Tensor, + ) -> Tensor: + """Forward pass for ONNX export. + + Args: + lang_tokens: Pre-tokenized language tokens of shape (batch, seq_len). + lang_masks: Language attention masks of shape (batch, seq_len). + noise: Initial noise tensor of shape (batch, n_action_steps, max_action_dim). + This should be sampled from N(0, 1) externally. + *images: Variable number of image tensors, each of shape (batch, 3, H, W). + + Returns: + Action tensor of shape (batch, n_action_steps, action_dim). + """ + # Process images + print("Starting forward pass of the wrapper...") + processed_images, img_masks = self._preprocess_images(list(images)) + + actions = self.policy.model.sample_actions( + processed_images, + img_masks, + lang_tokens, + lang_masks, + noise=noise, ) + + # Unpad actions + original_action_dim = self.config.action_feature.shape[0] + actions = actions[:, :, :original_action_dim] + + actions = self.policy.unnormalize_outputs({"actions": actions})["actions"] + + # `policy.model.forward` returns a (batch_size, n_action_steps, action_dim) tensor, but the queue + # effectively has shape (n_action_steps, batch_size, *), hence the transpose. + actions = actions.transpose(0, 1) + print("Finished forward pass of the wrapper") return actions -# Get the VLM cache for the dummy observation. This guarantees consistency with post-loading usage. -def get_vlm_cache(cfg: TrainPipelineConfig, device: torch.device, dtype: torch.dtype): - logging.info("Getting VLM cache...") - policy_class = get_policy_class(cfg.policy.type) - cloud_vlm = policy_class.from_pretrained(cfg.policy.pretrained_path, config=cfg.policy) - cloud_vlm.set_execution_target("cloud") - cloud_vlm.to(device=device, dtype=torch.bfloat16) - cloud_vlm.eval() - - vlm_camera_observation = { - f"camera{i}": torch.zeros((1, 3, *cfg.resolution), dtype=torch.bfloat16, device=device) - for i in range(cfg.num_cams) - } - vlm_observation = { - **vlm_camera_observation, - "prompt": ["Pick up yellow lego block and put it in the bin"], - "state": torch.zeros((1, cfg.max_state_dim), dtype=torch.bfloat16, device=device), - "img_is_pad": torch.zeros((1, cfg.num_cams), dtype=torch.bool, device=device), - } - cache, prefix_pad_masks, prefix_offsets, num_cross_att_tokens = cloud_vlm.get_vlm_tokens(vlm_observation) - assert len(cache) == 1, f"Expected only one cache entry for the dummy observation. Got {len(cache)}." - idx = list(cache)[0] - return ( - cache[idx][KEY_STATES].to(dtype=dtype), - cache[idx][VALUE_STATES].to(dtype=dtype), - prefix_pad_masks, - prefix_offsets, - num_cross_att_tokens, - idx, +def create_onnx_inputs(policy: PI05Policy, cfg, device, dtype): + """Create dummy inputs for ONNX export by pre-tokenizing a sample prompt. + + Args: + policy: The PI05Policy instance (for tokenization). + cfg: Configuration object. + device: Device to create tensors on. + dtype: Data type for tensors. + + Returns: + Tuple of (lang_tokens, lang_masks, noise, images_list, input_names_list). + """ + # Create a sample prompt and tokenize it + sample_prompt = "Pick up the object and place it in the target location" + sample_state_str = " ".join(["128"] * cfg.max_state_dim) # Middle bin values + + if policy.config.predict_response: + full_prompt = f"Task: {sample_prompt}State: {sample_state_str}Response:" + else: + full_prompt = f"Task: {sample_prompt}State: {sample_state_str}Actions:" + + tokenized = policy.language_tokenizer( + [full_prompt], + padding="max_length", + padding_side="right", + max_length=policy.config.prompt_max_length, + return_tensors="pt", + truncation=True, ) + lang_tokens = tokenized["input_ids"].to(device=device) + lang_masks = tokenized["attention_mask"].to(device=device, dtype=torch.bool) + + # Create dummy noise (sampled from N(0, 1)) + # Shape: (batch_size, n_action_steps, max_action_dim) + noise_shape = (1, policy.config.n_action_steps, policy.config.max_action_dim) + noise = torch.randn(noise_shape, dtype=dtype, device=device) + + # Create dummy images + resolution = cfg.resolution if hasattr(cfg, "resolution") else (224, 224) + images = [] + for _ in range(cfg.num_cams): + img = torch.zeros((1, 3, *resolution), dtype=dtype, device=device) + images.append(img) + + # Build input names: lang_tokens, lang_masks, noise, image0, image1, ... + input_names = ["lang_tokens", "lang_masks", "noise"] + [f"image{i}" for i in range(len(images))] + + return lang_tokens, lang_masks, noise, images, input_names + @parser.wrap() def main(cfg: TrainPipelineConfig): + """Main export function.""" device = auto_torch_device() - dtype = torch.float32 - - # arguments for the dummy observation - ( - key_states, - value_states, - prefix_pad_masks, - prefix_offsets, - num_cross_att_tokens, - layer_idx, - ) = get_vlm_cache(cfg, device, dtype) - state = torch.zeros((1, cfg.max_state_dim), device=device, dtype=dtype) - args = (key_states, value_states, state) - logging.info("Generated example args") - - policy_class = get_policy_class(cfg.policy.type) - robot_action_decoder = policy_class.from_pretrained(cfg.policy.pretrained_path, config=cfg.policy) - robot_action_decoder.set_execution_target("robot") - robot_action_decoder.to(device) - robot_action_decoder.to(dtype=dtype) - robot_action_decoder.eval() - inference_wrapper = InferenceWrapper( - robot_action_decoder, - prefix_pad_masks=prefix_pad_masks, - prefix_offsets=prefix_offsets, - num_cross_att_tokens=num_cross_att_tokens, - layer_idx=layer_idx, - ) - logging.info("Loaded policy") + dtype = torch.bfloat16 logging.info("Applying monkey patches...") for patch in patches: patch() - logging.info("Exporting model to ONNX...") + logging.info("Loading policy...") + policy_class = get_policy_class(cfg.policy.type) + policy = policy_class.from_pretrained(cfg.policy.pretrained_path, config=cfg.policy) + policy.to(device) + policy.to(dtype=dtype) + policy.eval() + + if not isinstance(policy, PI05Policy): + raise ValueError(f"ONNX export currently only supports PI05Policy, got {type(policy)}") + + # Create ONNX-compatible wrapper + wrapper = PI05OnnxWrapper(policy) + wrapper.to(device) + wrapper.eval() + logging.info("Created ONNX inference wrapper") + + # Create dummy inputs by pre-tokenizing + lang_tokens, lang_masks, noise, images, input_names = create_onnx_inputs(policy, cfg, device, dtype) + logging.info(f"Generated example inputs with {len(images)} cameras") + logging.info(f"Language tokens shape: {lang_tokens.shape}") + logging.info(f"Noise shape: {noise.shape}") + logging.info(f"Input names: {input_names}") + + # Build args tuple: (lang_tokens, lang_masks, noise, image0, image1, ...) + args = (lang_tokens, lang_masks, noise) + tuple(images) + + logging.info("Exporting model to ONNX with Dynamo exporter...") + output_path = Path(cfg.policy.pretrained_path) / "model.onnx" + output_path = output_path.resolve() + output_path.parent.mkdir(parents=True, exist_ok=True) + # External data file is saved alongside the .onnx file with .onnx_data suffix + weights_path = output_path.with_suffix(".onnx_data") + with torch.inference_mode(): - path = Path(cfg.policy.pretrained_path) / "robot_action_decoder.onnx" - path = path.resolve() - path.parent.mkdir(parents=True, exist_ok=True) # Should be a no-op - print("Exporting model to ONNX at path:", path) - print("Current directory:", Path.cwd()) - print("Trying to write to:", path) - with open(path, "wb"): - print("Write permissions check passed for:", path) - print("Running torch.onnx.export...") + logging.info("Running standard ONNX export...") + # Use standard export instead of dynamo for better compatibility + # Dynamo export can sometimes produce invalid graphs for bfloat16 torch.onnx.export( - inference_wrapper.eval(), + wrapper, args, - path, - input_names=[KEY_STATES, VALUE_STATES, "state"], - output_names=["action_chunk"], - opset_version=18, - do_constant_folding=False, # constant folding causes weird errors (getting dim -1 from a 0-dim scalar) after forward pass succeeds + str(output_path), + verbose=False, + opset_version=19, + input_names=input_names, + output_names=["actions"], + do_constant_folding=True, + dynamo=False, ) - logging.info(f"Successfully exported model to '{path}'.") + + logging.info(f"Successfully exported model to '{output_path}'") + + logging.info( + "\nNote: The exported ONNX model uses external data format.\n" + "When loading the model, ensure both files are in the same directory:\n" + f" - {output_path.name} (model structure)\n" + f" - {weights_path.name} (model weights)\n" + ) + + logging.info( + "The exported ONNX model accepts pre-tokenized inputs.\n" + "For inference, you need to:\n" + "1. Tokenize your prompt externally using the same tokenizer\n" + "2. Preprocess images to [0,1] range with correct resolution\n" + "3. Run the ONNX model with these inputs" + ) if __name__ == "__main__": - main() + main() \ No newline at end of file From 9396fd8e9b9324e8d67c8e14599f589414271cb6 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Tue, 3 Feb 2026 11:30:37 -0800 Subject: [PATCH 2/7] fix: export the model in fp32 using torch dynamo --- src/opentau/policies/normalize.py | 10 ++++++---- src/opentau/scripts/export_to_onnx.py | 16 ++++++---------- src/opentau/scripts/onnx_inference.py | 0 3 files changed, 12 insertions(+), 14 deletions(-) create mode 100644 src/opentau/scripts/onnx_inference.py diff --git a/src/opentau/policies/normalize.py b/src/opentau/policies/normalize.py index 12924da..edec9f1 100644 --- a/src/opentau/policies/normalize.py +++ b/src/opentau/policies/normalize.py @@ -300,14 +300,16 @@ def forward(self, batch: dict[str, Tensor]) -> dict[str, Tensor]: if norm_mode is NormalizationMode.MEAN_STD: mean = buffer["mean"] std = buffer["std"] - assert not torch.isinf(mean).any(), _no_stats_error_str("mean") - assert not torch.isinf(std).any(), _no_stats_error_str("std") + if not torch.compiler.is_compiling(): + assert not torch.isinf(mean).any(), _no_stats_error_str("mean") + assert not torch.isinf(std).any(), _no_stats_error_str("std") batch[key] = batch[key] * (std + EPS) + mean elif norm_mode is NormalizationMode.MIN_MAX: min = buffer["min"] max = buffer["max"] - assert not torch.isinf(min).any(), _no_stats_error_str("min") - assert not torch.isinf(max).any(), _no_stats_error_str("max") + if not torch.compiler.is_compiling(): + assert not torch.isinf(min).any(), _no_stats_error_str("min") + assert not torch.isinf(max).any(), _no_stats_error_str("max") batch[key] = (batch[key] + 1) / 2 batch[key] = batch[key] * (max - min + EPS) + min else: diff --git a/src/opentau/scripts/export_to_onnx.py b/src/opentau/scripts/export_to_onnx.py index e934f88..007120d 100644 --- a/src/opentau/scripts/export_to_onnx.py +++ b/src/opentau/scripts/export_to_onnx.py @@ -46,7 +46,7 @@ torch_full_patch, torch_pow_patch, ) -from opentau.utils.utils import auto_torch_device +from opentau.utils.utils import auto_torch_device, init_logging # Some patches are necessary only for dynamo export, which has current upstream bugs. # Nonetheless, we apply them here to ensure future compatibility. @@ -212,7 +212,7 @@ def create_onnx_inputs(policy: PI05Policy, cfg, device, dtype): def main(cfg: TrainPipelineConfig): """Main export function.""" device = auto_torch_device() - dtype = torch.bfloat16 + dtype = torch.float32 logging.info("Applying monkey patches...") for patch in patches: @@ -249,22 +249,17 @@ def main(cfg: TrainPipelineConfig): output_path = output_path.resolve() output_path.parent.mkdir(parents=True, exist_ok=True) # External data file is saved alongside the .onnx file with .onnx_data suffix - weights_path = output_path.with_suffix(".onnx_data") + weights_path = output_path.with_suffix(".onnx.data") with torch.inference_mode(): - logging.info("Running standard ONNX export...") - # Use standard export instead of dynamo for better compatibility - # Dynamo export can sometimes produce invalid graphs for bfloat16 + logging.info("Running dynamo ONNX export...") torch.onnx.export( wrapper, args, str(output_path), - verbose=False, - opset_version=19, input_names=input_names, output_names=["actions"], - do_constant_folding=True, - dynamo=False, + dynamo=True, ) logging.info(f"Successfully exported model to '{output_path}'") @@ -286,4 +281,5 @@ def main(cfg: TrainPipelineConfig): if __name__ == "__main__": + init_logging() main() \ No newline at end of file diff --git a/src/opentau/scripts/onnx_inference.py b/src/opentau/scripts/onnx_inference.py new file mode 100644 index 0000000..e69de29 From 6d8e949694f63ea59e1ecb5e24484a5f7bb8a3cd Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Wed, 4 Feb 2026 14:11:05 -0800 Subject: [PATCH 3/7] feat: working ONNX --- src/opentau/policies/normalize.py | 4 +- src/opentau/policies/pi05/modeling_pi05.py | 10 +- .../policies/pi05/paligemma_with_expert.py | 14 +- src/opentau/scripts/onnx_inference.py | 255 ++++++++++++++++++ 4 files changed, 273 insertions(+), 10 deletions(-) diff --git a/src/opentau/policies/normalize.py b/src/opentau/policies/normalize.py index edec9f1..54115fa 100644 --- a/src/opentau/policies/normalize.py +++ b/src/opentau/policies/normalize.py @@ -300,14 +300,14 @@ def forward(self, batch: dict[str, Tensor]) -> dict[str, Tensor]: if norm_mode is NormalizationMode.MEAN_STD: mean = buffer["mean"] std = buffer["std"] - if not torch.compiler.is_compiling(): + if not (torch.compiler.is_compiling() or torch.onnx.is_in_onnx_export()): assert not torch.isinf(mean).any(), _no_stats_error_str("mean") assert not torch.isinf(std).any(), _no_stats_error_str("std") batch[key] = batch[key] * (std + EPS) + mean elif norm_mode is NormalizationMode.MIN_MAX: min = buffer["min"] max = buffer["max"] - if not torch.compiler.is_compiling(): + if not (torch.compiler.is_compiling() or torch.onnx.is_in_onnx_export()): assert not torch.isinf(min).any(), _no_stats_error_str("min") assert not torch.isinf(max).any(), _no_stats_error_str("max") batch[key] = (batch[key] + 1) / 2 diff --git a/src/opentau/policies/pi05/modeling_pi05.py b/src/opentau/policies/pi05/modeling_pi05.py index 8a02b3a..ea5349f 100644 --- a/src/opentau/policies/pi05/modeling_pi05.py +++ b/src/opentau/policies/pi05/modeling_pi05.py @@ -46,6 +46,10 @@ from opentau.utils.utils import get_safe_dtype +def _preferred_dtype(): + return torch.float32 if torch.onnx.is_in_onnx_export() else torch.bfloat16 + + def create_sinusoidal_pos_embedding( time: Tensor, dimension: int, min_period: float, max_period: float, device: torch.device | str = "cpu" ) -> Tensor: @@ -988,7 +992,7 @@ def embed_prefix( img_mask, ) in zip(images, img_masks, strict=False): img_emb = self.paligemma_with_expert.embed_image(img) - img_emb = img_emb.to(dtype=torch.bfloat16) + img_emb = img_emb.to(dtype=_preferred_dtype()) # image embeddings don't need to be unnormalized because `fix/lerobot_openpi` branch of huggingface # already removed the normalization inside PaliGemma @@ -1032,7 +1036,7 @@ def embed_prefix( if discrete_actions is not None: discrete_action_emb = self.paligemma_with_expert.embed_discrete_actions(discrete_actions) - embs.append(discrete_action_emb.to(dtype=torch.bfloat16)) + embs.append(discrete_action_emb.to(dtype=_preferred_dtype())) pad_masks.append(discrete_action_masks) att_masks += [1] * discrete_action_emb.shape[1] @@ -1062,7 +1066,7 @@ def embed_suffix(self, noisy_actions: Tensor, timestep: Tensor) -> tuple[Tensor, att_masks = [] bsize = noisy_actions.shape[0] - dtype = torch.bfloat16 + dtype = _preferred_dtype() device = noisy_actions.device # Embed timestep using sine-cosine positional encoding with sensitivity in the range [0, 1] diff --git a/src/opentau/policies/pi05/paligemma_with_expert.py b/src/opentau/policies/pi05/paligemma_with_expert.py index 353e8cd..6abdb1a 100644 --- a/src/opentau/policies/pi05/paligemma_with_expert.py +++ b/src/opentau/policies/pi05/paligemma_with_expert.py @@ -23,11 +23,10 @@ """ import torch -import torch.version -from pytest import Cache from torch import nn from transformers import ( AutoConfig, + Cache, GemmaForCausalLM, PaliGemmaForConditionalGeneration, PretrainedConfig, @@ -37,6 +36,10 @@ from transformers.models.gemma import modeling_gemma +def _preferred_dtype(): + return torch.float32 if torch.onnx.is_in_onnx_export() else torch.bfloat16 + + def apply_rope(x: torch.Tensor, positions: torch.Tensor, max_wavelength: int = 10_000) -> torch.Tensor: """Applies RoPE positions to the input tensor. @@ -246,7 +249,8 @@ def __init__(self, config: PaliGemmaWithExpertConfig): self.dropout = nn.Dropout(config.dropout) - self.to_bfloat16_like_physical_intelligence() + if not torch.compiler.is_compiling(): # Only cast to bfloat16 if not compiling + self.to_bfloat16_like_physical_intelligence() self.set_requires_grad() def set_requires_grad(self) -> None: @@ -402,7 +406,7 @@ def forward( input_shape = hidden_states.shape[:-1] hidden_shape = (*input_shape, -1, layer.self_attn.head_dim) - hidden_states = hidden_states.to(dtype=torch.bfloat16) + hidden_states = hidden_states.to(dtype=_preferred_dtype()) query_state = layer.self_attn.q_proj(hidden_states).view(hidden_shape) key_state = layer.self_attn.k_proj(hidden_states).view(hidden_shape) value_state = layer.self_attn.v_proj(hidden_states).view(hidden_shape) @@ -442,7 +446,7 @@ def forward( att_output = attention_interface( attention_mask, batch_size, head_dim, query_states, key_states, value_states ) - att_output = att_output.to(dtype=torch.bfloat16) + att_output = att_output.to(dtype=_preferred_dtype()) # first part of att_output is prefix (up to sequence length, [:, 0:prefix_seq_len]) outputs_embeds = [] diff --git a/src/opentau/scripts/onnx_inference.py b/src/opentau/scripts/onnx_inference.py index e69de29..9ef69e4 100644 --- a/src/opentau/scripts/onnx_inference.py +++ b/src/opentau/scripts/onnx_inference.py @@ -0,0 +1,255 @@ +# Copyright 2026 Tensor Auto Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ONNX inference script for Pi0.5 (PI05) policies. + +Loads an exported ONNX model (model.onnx + model.onnx.data) and runs inference. +Required shapes and settings are passed via command line. + +Usage: + python -m opentau.scripts.onnx_inference --checkpoint_dir \\ + [--num_cams 2] [--resolution_height 224] [--resolution_width 224] \\ + [--prompt_max_length 256] [--n_action_steps 10] [--max_action_dim 32] [--max_state_dim 32] \\ + [--predict_response true] [--prompt "Pick up the object"] [--n_repeats 3] +""" + +import logging +import time +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import onnxruntime as ort +from transformers import AutoTokenizer + +from opentau.configs import parser +from opentau.utils.utils import init_logging + +PI05_TOKENIZER_ID = "google/paligemma-3b-pt-224" + + +@dataclass +class OnnxInferenceArgs: + checkpoint_dir: str + num_cams: int = 2 + resolution_height: int = 224 + resolution_width: int = 224 + prompt_max_length: int = 256 + n_action_steps: int = 10 + max_action_dim: int = 32 + max_state_dim: int = 32 + predict_response: bool = False + prompt: str = "Pick up the object and place it in the target location" + n_repeats: int = 3 + provider: str | None = None + seed: int = 42 + + +def _prepare_discrete_state(state: np.ndarray) -> list[str]: + """Discretize state into 256 bins and return space-separated string per batch item. + + State is expected to be in [-1, 1]. Values outside are clipped. + """ + state = np.clip(state.astype(np.float32), -1.0, 1.0) + bins = np.linspace(-1.0, 1.0, 256 + 1)[:-1] + discretized = np.digitize(state, bins) - 1 + return [" ".join(map(str, row)) for row in discretized] + + +def _build_prompt( + task: str, + state_str: str, + predict_response: bool, +) -> str: + """Build the full prompt string as expected by the PI05 tokenizer.""" + if predict_response: + return f"Task: {task}State: {state_str}Response:" + return f"Task: {task}State: {state_str}Actions:" + + +def _tokenize_prompt( + tokenizer, + prompt: str, + prompt_max_length: int, + device: str = "cpu", +) -> tuple[np.ndarray, np.ndarray]: + """Tokenize a single prompt and return input_ids and attention_mask as numpy.""" + tokenized = tokenizer( + [prompt], + padding="max_length", + padding_side="right", + max_length=prompt_max_length, + return_tensors="np", + truncation=True, + ) + return tokenized["input_ids"].astype(np.int64), tokenized["attention_mask"].astype(np.int64) + + +def load_onnx_session(checkpoint_dir: Path, provider: str | None = None) -> ort.InferenceSession: + """Load ONNX model from checkpoint directory. + + Expects model.onnx (and optionally model.onnx.data for external weights) in checkpoint_dir. + """ + onnx_path = checkpoint_dir / "model.onnx" + if not onnx_path.is_file(): + raise FileNotFoundError(f"ONNX model not found: {onnx_path}") + + providers = provider or ( + ["CUDAExecutionProvider", "CPUExecutionProvider"] + if ort.get_device() == "GPU" + else ["CPUExecutionProvider"] + ) + sess_options = ort.SessionOptions() + sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL + + session = ort.InferenceSession( + str(onnx_path), + sess_options=sess_options, + providers=providers, + ) + return session + + +def run_inference( + session: ort.InferenceSession, + tokenizer, + args: OnnxInferenceArgs, + *, + prompt: str, + state: np.ndarray, + images: list[np.ndarray], + noise: np.ndarray | None = None, + rng: np.random.Generator | None = None, +) -> np.ndarray: + """Run one ONNX inference step. + + Args: + session: Loaded ONNX InferenceSession. + tokenizer: HuggingFace tokenizer (e.g. PaliGemma). + args: OnnxInferenceArgs with shapes and prompt settings. + prompt: Task description string. + state: State vector of shape (batch_size, max_state_dim) in [-1, 1]. + images: List of image arrays, each (batch_size, 3, H, W) in [0, 1]. + noise: Optional noise tensor (batch, n_action_steps, max_action_dim). If None, sampled from N(0,1). + rng: Optional numpy RNG for reproducibility. + + Returns: + actions: (batch_size, n_action_steps, action_dim) in unnormalized space. + """ + batch_size = state.shape[0] + rng = rng or np.random.default_rng() + + state_strs = _prepare_discrete_state(state) + full_prompts = [ + _build_prompt(prompt, s, args.predict_response) for s in state_strs + ] + p = full_prompts[0] + lang_tokens, lang_masks = _tokenize_prompt( + tokenizer, p, args.prompt_max_length + ) + if batch_size > 1: + lang_tokens = np.repeat(lang_tokens, batch_size, axis=0) + lang_masks = np.repeat(lang_masks, batch_size, axis=0) + + if noise is None: + noise = rng.standard_normal( + (batch_size, args.n_action_steps, args.max_action_dim), + dtype=np.float32, + ) + + num_cams = args.num_cams + if len(images) != num_cams: + raise ValueError( + f"Expected {num_cams} images (num_cams), got {len(images)}" + ) + resolution = (args.resolution_height, args.resolution_width) + for i, img in enumerate(images): + if img.shape[2:] != resolution: + raise ValueError( + f"Image {i} shape {img.shape}: expected H,W={resolution}" + ) + if img.shape[0] != batch_size: + raise ValueError( + f"Image {i} batch size {img.shape[0]} != state batch size {batch_size}" + ) + + # Build input dict: lang_tokens, lang_masks, noise, image0, image1, ... + input_feed = { + "lang_tokens": lang_tokens, + "lang_masks": lang_masks.astype(np.bool_), + "noise": noise, + } + for i in range(num_cams): + input_feed[f"image{i}"] = images[i].astype(np.float32) + + # Output is "actions" with shape (n_action_steps, batch_size, action_dim) + outputs = session.run(None, input_feed) + actions = outputs[0] + # Transpose to (batch_size, n_action_steps, action_dim) + actions = np.transpose(actions, (1, 0, 2)) + return actions + + +@parser.wrap() +def main(args: OnnxInferenceArgs): + init_logging() + checkpoint_dir = Path(args.checkpoint_dir).resolve() + if not checkpoint_dir.is_dir(): + raise FileNotFoundError(f"Checkpoint directory not found: {checkpoint_dir}") + + logging.info("Loading ONNX model from %s", checkpoint_dir) + session = load_onnx_session(checkpoint_dir, provider=args.provider) + + logging.info("Loading tokenizer %s", PI05_TOKENIZER_ID) + tokenizer = AutoTokenizer.from_pretrained(PI05_TOKENIZER_ID) + + batch_size = 1 + state = np.zeros((batch_size, args.max_state_dim), dtype=np.float32) + images = [ + np.zeros((batch_size, 3, args.resolution_height, args.resolution_width), dtype=np.float32) + for _ in range(args.num_cams) + ] + rng = np.random.default_rng(args.seed) + + logging.info("Running %d inference repeat(s)...", args.n_repeats) + step_times = [] + for step in range(args.n_repeats): + t0 = time.perf_counter() + actions = run_inference( + session, + tokenizer, + args, + prompt=args.prompt, + state=state, + images=images, + rng=rng, + ) + step_times.append(time.perf_counter() - t0) + if step == 0: + logging.info( + "Output actions shape: %s (batch, n_action_steps, action_dim)", + actions.shape, + ) + total_s = sum(step_times) + mean_ms = (total_s / len(step_times)) * 1000 + logging.info( + "ONNX inference: %d runs, total %.3f s, mean %.2f ms/run", + args.n_repeats, + total_s, + mean_ms, + ) + + +if __name__ == "__main__": + main() From 93aa1af03ea646183890ff854be12e23a1bbb3f3 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Wed, 4 Feb 2026 14:30:23 -0800 Subject: [PATCH 4/7] refactor: remove repetitive image processing code --- src/opentau/scripts/export_to_onnx.py | 55 +++++---------------------- src/opentau/scripts/onnx_inference.py | 43 ++++++++------------- 2 files changed, 24 insertions(+), 74 deletions(-) diff --git a/src/opentau/scripts/export_to_onnx.py b/src/opentau/scripts/export_to_onnx.py index 007120d..e82588f 100644 --- a/src/opentau/scripts/export_to_onnx.py +++ b/src/opentau/scripts/export_to_onnx.py @@ -40,7 +40,7 @@ from opentau.configs import parser from opentau.configs.train import TrainPipelineConfig from opentau.policies.factory import get_policy_class -from opentau.policies.pi05.modeling_pi05 import PI05Policy, resize_with_pad +from opentau.policies.pi05.modeling_pi05 import PI05Policy from opentau.utils.monkey_patch import ( torch_cumsum_patch, torch_full_patch, @@ -70,10 +70,7 @@ class PI05OnnxWrapper(torch.nn.Module): 3. Runs the flow matching denoising with a fixed number of steps """ - def __init__( - self, - policy: PI05Policy, - ): + def __init__(self, policy: PI05Policy): """Initialize the ONNX wrapper. Args: @@ -82,44 +79,8 @@ def __init__( """ super().__init__() self.policy = policy - self.config = policy.config - def _preprocess_images(self, images: list[Tensor]) -> tuple[list[Tensor], list[Tensor]]: - """Preprocess images for the model (pure PyTorch operations). - - Args: - images: List of image tensors, each of shape (batch, 3, H, W) in range [0, 1]. - - Returns: - Tuple of (processed_images, image_masks). - """ - processed_images = [] - img_masks = [] - - for img in images: - # Resize with padding if configured - if self.config.resize_imgs_with_padding is not None: - img = resize_with_pad(img, *self.config.resize_imgs_with_padding, pad_value=0) - - # Normalize from [0,1] to [-1,1] as expected by SigLIP - img = img * 2.0 - 1.0 - - bsize = img.shape[0] - device = img.device - mask = torch.ones(bsize, dtype=torch.bool, device=device) - - processed_images.append(img) - img_masks.append(mask) - - return processed_images, img_masks - - def forward( - self, - lang_tokens: Tensor, - lang_masks: Tensor, - noise: Tensor, - *images: Tensor, - ) -> Tensor: + def forward(self, lang_tokens: Tensor, lang_masks: Tensor, noise: Tensor, *images: Tensor) -> Tensor: """Forward pass for ONNX export. Args: @@ -132,9 +93,11 @@ def forward( Returns: Action tensor of shape (batch, n_action_steps, action_dim). """ - # Process images print("Starting forward pass of the wrapper...") - processed_images, img_masks = self._preprocess_images(list(images)) + + # Process images + image_batch = {f"camera{i}": img for i, img in enumerate(images)} + processed_images, img_masks = self.policy.prepare_images(image_batch) actions = self.policy.model.sample_actions( processed_images, @@ -145,7 +108,7 @@ def forward( ) # Unpad actions - original_action_dim = self.config.action_feature.shape[0] + original_action_dim = self.policy.config.action_feature.shape[0] actions = actions[:, :, :original_action_dim] actions = self.policy.unnormalize_outputs({"actions": actions})["actions"] @@ -282,4 +245,4 @@ def main(cfg: TrainPipelineConfig): if __name__ == "__main__": init_logging() - main() \ No newline at end of file + main() diff --git a/src/opentau/scripts/onnx_inference.py b/src/opentau/scripts/onnx_inference.py index 9ef69e4..656dfbf 100644 --- a/src/opentau/scripts/onnx_inference.py +++ b/src/opentau/scripts/onnx_inference.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""ONNX inference script for Pi0.5 (PI05) policies. +"""Inference script for exported ONNX models. Loads an exported ONNX model (model.onnx + model.onnx.data) and runs inference. Required shapes and settings are passed via command line. @@ -67,23 +67,14 @@ def _prepare_discrete_state(state: np.ndarray) -> list[str]: return [" ".join(map(str, row)) for row in discretized] -def _build_prompt( - task: str, - state_str: str, - predict_response: bool, -) -> str: +def _build_prompt(task: str, state_str: str, predict_response: bool) -> str: """Build the full prompt string as expected by the PI05 tokenizer.""" if predict_response: return f"Task: {task}State: {state_str}Response:" return f"Task: {task}State: {state_str}Actions:" -def _tokenize_prompt( - tokenizer, - prompt: str, - prompt_max_length: int, - device: str = "cpu", -) -> tuple[np.ndarray, np.ndarray]: +def _tokenize_prompt(tokenizer, prompt: str, prompt_max_length: int) -> tuple[np.ndarray, np.ndarray]: """Tokenize a single prompt and return input_ids and attention_mask as numpy.""" tokenized = tokenizer( [prompt], @@ -98,8 +89,14 @@ def _tokenize_prompt( def load_onnx_session(checkpoint_dir: Path, provider: str | None = None) -> ort.InferenceSession: """Load ONNX model from checkpoint directory. - Expects model.onnx (and optionally model.onnx.data for external weights) in checkpoint_dir. + + Args: + checkpoint_dir: Path to the checkpoint directory containing the ONNX model. + provider: ONNX runtime provider to use. If None, will use the default provider. + + Returns: + ONNX inference session. """ onnx_path = checkpoint_dir / "model.onnx" if not onnx_path.is_file(): @@ -151,13 +148,9 @@ def run_inference( rng = rng or np.random.default_rng() state_strs = _prepare_discrete_state(state) - full_prompts = [ - _build_prompt(prompt, s, args.predict_response) for s in state_strs - ] + full_prompts = [_build_prompt(prompt, s, args.predict_response) for s in state_strs] p = full_prompts[0] - lang_tokens, lang_masks = _tokenize_prompt( - tokenizer, p, args.prompt_max_length - ) + lang_tokens, lang_masks = _tokenize_prompt(tokenizer, p, args.prompt_max_length) if batch_size > 1: lang_tokens = np.repeat(lang_tokens, batch_size, axis=0) lang_masks = np.repeat(lang_masks, batch_size, axis=0) @@ -170,19 +163,13 @@ def run_inference( num_cams = args.num_cams if len(images) != num_cams: - raise ValueError( - f"Expected {num_cams} images (num_cams), got {len(images)}" - ) + raise ValueError(f"Expected {num_cams} images (num_cams), got {len(images)}") resolution = (args.resolution_height, args.resolution_width) for i, img in enumerate(images): if img.shape[2:] != resolution: - raise ValueError( - f"Image {i} shape {img.shape}: expected H,W={resolution}" - ) + raise ValueError(f"Image {i} shape {img.shape}: expected H,W={resolution}") if img.shape[0] != batch_size: - raise ValueError( - f"Image {i} batch size {img.shape[0]} != state batch size {batch_size}" - ) + raise ValueError(f"Image {i} batch size {img.shape[0]} != state batch size {batch_size}") # Build input dict: lang_tokens, lang_masks, noise, image0, image1, ... input_feed = { From 10c7af4497e3e77a9c2836af882345ce02402939 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Wed, 4 Feb 2026 15:27:02 -0800 Subject: [PATCH 5/7] feat(inference): log both mean and std of ONNX inference --- src/opentau/scripts/onnx_inference.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/opentau/scripts/onnx_inference.py b/src/opentau/scripts/onnx_inference.py index 656dfbf..f1b25c5 100644 --- a/src/opentau/scripts/onnx_inference.py +++ b/src/opentau/scripts/onnx_inference.py @@ -228,13 +228,21 @@ def main(args: OnnxInferenceArgs): "Output actions shape: %s (batch, n_action_steps, action_dim)", actions.shape, ) - total_s = sum(step_times) - mean_ms = (total_s / len(step_times)) * 1000 + times_ms = np.array(step_times) * 1000 logging.info( - "ONNX inference: %d runs, total %.3f s, mean %.2f ms/run", + "ONNX inference: %d runs, total %.3f s, mean %.2f ms/run, std %.2f ms", args.n_repeats, - total_s, - mean_ms, + np.sum(step_times), + np.mean(times_ms), + np.std(times_ms), + ) + logging.info( + "ONNX inference latency (ms): min %.2f, max %.2f, median %.2f, p5 %.2f, p95 %.2f", + np.min(times_ms), + np.max(times_ms), + np.median(times_ms), + np.percentile(times_ms, 5), + np.percentile(times_ms, 95), ) From 7fcd30a92ceba04e80895a9d3a1d1d6aceb8fe87 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Wed, 4 Feb 2026 15:51:57 -0800 Subject: [PATCH 6/7] feat: load ONNX model on TensorRT and run inference benchmark --- pyproject.toml | 4 + src/opentau/scripts/tensorrt_inference.py | 190 ++++++++++++++++++ uv.lock | 234 ++++++++++++++-------- 3 files changed, 344 insertions(+), 84 deletions(-) create mode 100644 src/opentau/scripts/tensorrt_inference.py diff --git a/pyproject.toml b/pyproject.toml index 4ab4a39..7df6204 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -135,6 +135,10 @@ libero = [ urdf = [ "rerun-sdk>=0.28.2", ] +trt = [ + "tensorrt>=10.15.1.29", + "tensorrt>=10.9.0 ; (sys_platform == 'linux' and platform_machine == 'x86_64') or (sys_platform == 'win32' and (platform_machine == 'AMD64' or platform_machine == 'x86_64'))", +] [tool.uv.sources] libero = { git = "https://github.com/shuheng-liu/LIBERO" , branch = "master" } # the official libero repo is misconfigured for pip install with git diff --git a/src/opentau/scripts/tensorrt_inference.py b/src/opentau/scripts/tensorrt_inference.py new file mode 100644 index 0000000..5188904 --- /dev/null +++ b/src/opentau/scripts/tensorrt_inference.py @@ -0,0 +1,190 @@ +# Copyright 2026 Tensor Auto Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Inference script for exported ONNX models using TensorRT with FP16. + +Loads the same ONNX model as onnx_inference.py but runs it with the TensorRT +execution provider in FP16 for faster inference on GPU. The ONNX model can be +exported in FP32; TensorRT will execute it in FP16. + +Requires optional dependency: uv sync --extra trt + +Usage: + python -m opentau.scripts.tensorrt_inference --checkpoint_dir \\ + [--num_cams 2] [--resolution_height 224] [--resolution_width 224] \\ + [--predict_response true] [--n_repeats 3] [--engine_cache_dir ] +""" + +import logging +import os +import time +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +from transformers import AutoTokenizer + + +def _prepend_tensorrt_lib_path() -> None: + """Prepend TensorRT pip package lib path to LD_LIBRARY_PATH so the TRT EP can load libnvinfer.""" + lib_dirs_to_try = [] + import tensorrt as _trt + + pkg_root = Path(_trt.__path__[0]).resolve().parent + lib_dirs_to_try.append(pkg_root / "tensorrt_libs") + lib_dirs_to_try.append(Path(_trt.__path__[0]).resolve()) + lib_dirs_to_try.append(pkg_root / "lib") + for lib_dir in lib_dirs_to_try: + if lib_dir.is_dir() and any(lib_dir.glob("libnvinfer.so*")): + existing = os.environ.get("LD_LIBRARY_PATH", "") + os.environ["LD_LIBRARY_PATH"] = f"{lib_dir}{os.pathsep}{existing}" if existing else str(lib_dir) + return + + +_prepend_tensorrt_lib_path() +import onnxruntime as ort # noqa: E402 + +from opentau.configs import parser # noqa: E402 +from opentau.scripts.onnx_inference import ( # noqa: E402 + PI05_TOKENIZER_ID, + OnnxInferenceArgs, + run_inference, +) +from opentau.utils.utils import init_logging # noqa: E402 + + +@dataclass +class TensorrtInferenceArgs(OnnxInferenceArgs): + engine_cache_dir: str | None = None + + +def load_tensorrt_session( + checkpoint_dir: Path, + fp16: bool = True, + engine_cache_dir: Path | str | None = None, +) -> ort.InferenceSession: + """Load ONNX model with TensorRT execution provider (FP16 by default). + + Expects model.onnx (and optionally model.onnx.data) in checkpoint_dir. + First run may take several minutes while TensorRT builds and caches the engine. + + Args: + checkpoint_dir: Directory containing model.onnx. + fp16: If True, enable FP16 execution in TensorRT. + engine_cache_dir: Optional directory to cache the TensorRT engine for faster subsequent loads. + + Returns: + ONNX InferenceSession using TensorRT. + """ + onnx_path = checkpoint_dir / "model.onnx" + if not onnx_path.is_file(): + raise FileNotFoundError(f"ONNX model not found: {onnx_path}") + + trt_options: dict[str, str | int | bool] = { + "device_id": 0, + "trt_fp16_enable": fp16, + } + if engine_cache_dir is not None: + trt_options["trt_engine_cache_enable"] = True + trt_options["trt_engine_cache_path"] = str(engine_cache_dir) + + providers = [ + ("TensorrtExecutionProvider", trt_options), + "CUDAExecutionProvider", + "CPUExecutionProvider", + ] + + sess_options = ort.SessionOptions() + sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL + + logging.info( + "Building TensorRT session (FP16=%s). First run may take several minutes.", + fp16, + ) + session = ort.InferenceSession( + str(onnx_path), + sess_options=sess_options, + providers=providers, + ) + return session + + +@parser.wrap() +def main(args: TensorrtInferenceArgs): + init_logging() + checkpoint_dir = Path(args.checkpoint_dir).resolve() + if not checkpoint_dir.is_dir(): + raise FileNotFoundError(f"Checkpoint directory not found: {checkpoint_dir}") + + engine_cache = Path(args.engine_cache_dir).resolve() if args.engine_cache_dir else None + if engine_cache is not None: + engine_cache.mkdir(parents=True, exist_ok=True) + + logging.info("Loading ONNX model with TensorRT from %s", checkpoint_dir) + session = load_tensorrt_session( + checkpoint_dir, + fp16=True, + engine_cache_dir=engine_cache, + ) + + logging.info("Loading tokenizer %s", PI05_TOKENIZER_ID) + tokenizer = AutoTokenizer.from_pretrained(PI05_TOKENIZER_ID) + + batch_size = 1 + state = np.zeros((batch_size, args.max_state_dim), dtype=np.float32) + images = [ + np.zeros((batch_size, 3, args.resolution_height, args.resolution_width), dtype=np.float32) + for _ in range(args.num_cams) + ] + rng = np.random.default_rng(args.seed) + + logging.info("Running %d inference repeat(s)...", args.n_repeats) + step_times = [] + for step in range(args.n_repeats): + t0 = time.perf_counter() + actions = run_inference( + session, + tokenizer, + args, + prompt=args.prompt, + state=state, + images=images, + rng=rng, + ) + step_times.append(time.perf_counter() - t0) + if step == 0: + logging.info( + "Output actions shape: %s (batch, n_action_steps, action_dim)", + actions.shape, + ) + times_ms = np.array(step_times) * 1000 + logging.info( + "TensorRT inference: %d runs, total %.3f s, mean %.2f ms/run, std %.2f ms", + args.n_repeats, + np.sum(step_times), + np.mean(times_ms), + np.std(times_ms), + ) + logging.info( + "TensorRT inference latency (ms): min %.2f, max %.2f, median %.2f, p5 %.2f, p95 %.2f", + np.min(times_ms), + np.max(times_ms), + np.median(times_ms), + np.percentile(times_ms, 5), + np.percentile(times_ms, 95), + ) + + +if __name__ == "__main__": + main() diff --git a/uv.lock b/uv.lock index 979a40a..05af7b9 100644 --- a/uv.lock +++ b/uv.lock @@ -1,17 +1,23 @@ version = 1 -revision = 2 +revision = 3 requires-python = "==3.10.*" resolution-markers = [ - "sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf'", - "sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf'", + "platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf'", + "platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf'", + "(platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')", "sys_platform == 'emscripten' and extra != 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf'", "platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", - "platform_machine != 'aarch64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", "sys_platform == 'darwin' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "(platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf')", "sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", - "sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", - "sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", + "(platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf')", "sys_platform == 'emscripten' and extra != 'extra-7-opentau-libero' and extra != 'extra-7-opentau-urdf'", ] conflicts = [[ @@ -317,9 +323,11 @@ version = "3.31.10" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] sdist = { url = "https://files.pythonhosted.org/packages/37/7b/fbadb3f4fe90ad6ef57f9f5f9e4f721af8e86376fbdf11da2c6ed099830e/cmake-3.31.10.tar.gz", hash = "sha256:ec3d14a0e72e401b3665034dc37901df17f0b4e9c5b163be6cfedfb93470ac0f", size = 34499, upload-time = "2025-11-20T17:07:54.664Z" } @@ -349,8 +357,10 @@ name = "cmake" version = "4.2.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "sys_platform == 'linux'", - "sys_platform != 'emscripten' and sys_platform != 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] sdist = { url = "https://files.pythonhosted.org/packages/00/f5/e4f5a35864293a8605bf6e9366d406ee11565b91a22f38f8b8665096c718/cmake-4.2.1.tar.gz", hash = "sha256:a07a790ca65946667c0fb286549e8e0b5a850e2f8170ae60d3418573011ca218", size = 37060, upload-time = "2025-12-21T11:23:47.499Z" } @@ -452,7 +462,7 @@ name = "cuda-bindings" version = "12.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "cuda-pathfinder", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/37/31/bfcc870f69c6a017c4ad5c42316207fc7551940db6f3639aa4466ec5faf3/cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a022c96b8bd847e8dc0675523431149a4c3e872f440e3002213dbb9e08f0331a", size = 11800959, upload-time = "2025-10-21T14:51:26.458Z" }, @@ -1738,9 +1748,11 @@ version = "1.26.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } @@ -1760,8 +1772,10 @@ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "sys_platform == 'linux'", - "sys_platform != 'emscripten' and sys_platform != 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } @@ -1827,7 +1841,7 @@ name = "nvidia-cudnn-cu12" version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/fa/41/e79269ce215c857c935fd86bcfe91a451a584dfc27f1e068f568b9ad1ab7/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8", size = 705026878, upload-time = "2025-06-06T21:52:51.348Z" }, @@ -1840,7 +1854,7 @@ name = "nvidia-cufft-cu12" version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211, upload-time = "2025-03-07T01:44:56.873Z" }, @@ -1872,9 +1886,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841, upload-time = "2025-03-07T01:46:54.356Z" }, @@ -1887,7 +1901,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129, upload-time = "2025-03-07T01:47:40.407Z" }, @@ -2003,13 +2017,13 @@ name = "onnxruntime" version = "1.23.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coloredlogs" }, - { name = "flatbuffers" }, - { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-opentau-libero'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, - { name = "packaging" }, - { name = "protobuf" }, - { name = "sympy" }, + { name = "coloredlogs", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "flatbuffers", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero') or (platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "packaging", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "protobuf", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "sympy", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and sys_platform != 'win32') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/35/d6/311b1afea060015b56c742f3531168c1644650767f27ef40062569960587/onnxruntime-1.23.2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:a7730122afe186a784660f6ec5807138bf9d792fa1df76556b27307ea9ebcbe3", size = 17195934, upload-time = "2025-10-27T23:06:14.143Z" }, @@ -2024,13 +2038,13 @@ name = "onnxruntime-gpu" version = "1.23.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coloredlogs", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'darwin' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "flatbuffers", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'darwin' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and extra == 'extra-7-opentau-libero') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform != 'emscripten' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "packaging", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'darwin' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "protobuf", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'darwin' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "sympy", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux') or (sys_platform == 'darwin' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'darwin' and extra != 'extra-7-opentau-libero') or (sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "coloredlogs", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "flatbuffers", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-7-opentau-libero') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-7-opentau-libero') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-7-opentau-libero') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "packaging", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "protobuf", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "sympy", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32') or (sys_platform != 'linux' and sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/cb/ae/39283748c68a96be4f5f8a9561e0e3ca92af1eae6c2b1c07fb1da5f65cd1/onnxruntime_gpu-1.23.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18de50c6c8eea50acc405ea13d299aec593e46478d7a22cd32cdbbdf7c42899d", size = 300525411, upload-time = "2025-10-22T16:56:08.415Z" }, @@ -2080,9 +2094,11 @@ version = "4.11.0.86" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ @@ -2103,8 +2119,10 @@ name = "opencv-python" version = "4.13.0.90" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "sys_platform == 'linux'", - "sys_platform != 'emscripten' and sys_platform != 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ @@ -2127,9 +2145,11 @@ version = "4.11.0.86" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ @@ -2150,8 +2170,10 @@ name = "opencv-python-headless" version = "4.13.0.90" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "sys_platform == 'linux'", - "sys_platform != 'emscripten' and sys_platform != 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ @@ -2260,6 +2282,9 @@ openai = [ { name = "openai" }, { name = "python-dotenv" }, ] +trt = [ + { name = "tensorrt" }, +] urdf = [ { name = "rerun-sdk", version = "0.28.2", source = { registry = "https://pypi.org/simple" } }, ] @@ -2287,7 +2312,7 @@ requires-dist = [ { name = "gym", marker = "extra == 'libero'", specifier = ">=0.25,<0.27" }, { name = "gymnasium", extras = ["other"], specifier = ">=0.29" }, { name = "h5py", specifier = ">=3.10.0" }, - { name = "huggingface-hub", extras = ["hf-transfer", "cli"], marker = "python_full_version < '4.0'", specifier = ">=0.27.1" }, + { name = "huggingface-hub", extras = ["hf-transfer", "cli"], marker = "python_full_version < '4'", specifier = ">=0.27.1" }, { name = "imageio", extras = ["ffmpeg"], specifier = ">=2.34.0" }, { name = "jsonlines", specifier = ">=4.0.0" }, { name = "libero", marker = "extra == 'libero'", git = "https://github.com/shuheng-liu/LIBERO?branch=master" }, @@ -2337,6 +2362,8 @@ requires-dist = [ { name = "sphinx-copybutton", marker = "extra == 'dev'", specifier = ">=0.5.2" }, { name = "sphinx-design", marker = "extra == 'dev'", specifier = ">=0.6.1" }, { name = "sphinx-rtd-theme", marker = "extra == 'dev'", specifier = ">=3.0.1" }, + { name = "tensorrt", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'trt') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'trt') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'trt')", specifier = ">=10.9.0" }, + { name = "tensorrt", marker = "extra == 'trt'", specifier = ">=10.15.1.29" }, { name = "termcolor", specifier = ">=2.4.0" }, { name = "thop", marker = "extra == 'libero'", specifier = "==0.1.1.post2209072238" }, { name = "torch", specifier = ">=2.7.1" }, @@ -2346,7 +2373,7 @@ requires-dist = [ { name = "wandb", specifier = ">=0.16.3" }, { name = "zarr", specifier = ">=2.17.0" }, ] -provides-extras = ["dev", "openai", "libero", "urdf"] +provides-extras = ["dev", "openai", "libero", "urdf", "trt"] [[package]] name = "orderly-set" @@ -2673,10 +2700,10 @@ name = "pyobjc-framework-applicationservices" version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-coretext", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-core", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-cocoa", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-coretext", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-quartz", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/6a/d4e613c8e926a5744fc47a9e9fea08384a510dc4f27d844f7ad7a2d793bd/pyobjc_framework_applicationservices-12.1.tar.gz", hash = "sha256:c06abb74f119bc27aeb41bf1aef8102c0ae1288aec1ac8665ea186a067a8945b", size = 103247, upload-time = "2025-11-14T10:08:52.18Z" } wheels = [ @@ -2688,7 +2715,7 @@ name = "pyobjc-framework-cocoa" version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-core", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/a3/16ca9a15e77c061a9250afbae2eae26f2e1579eb8ca9462ae2d2c71e1169/pyobjc_framework_cocoa-12.1.tar.gz", hash = "sha256:5556c87db95711b985d5efdaaf01c917ddd41d148b1e52a0c66b1a2e2c5c1640", size = 2772191, upload-time = "2025-11-14T10:13:02.069Z" } wheels = [ @@ -2700,9 +2727,9 @@ name = "pyobjc-framework-coretext" version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-core", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-cocoa", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-quartz", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/29/da/682c9c92a39f713bd3c56e7375fa8f1b10ad558ecb075258ab6f1cdd4a6d/pyobjc_framework_coretext-12.1.tar.gz", hash = "sha256:e0adb717738fae395dc645c9e8a10bb5f6a4277e73cba8fa2a57f3b518e71da5", size = 90124, upload-time = "2025-11-14T10:14:38.596Z" } wheels = [ @@ -2714,8 +2741,8 @@ name = "pyobjc-framework-quartz" version = "12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyobjc-core", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, - { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and extra != 'extra-7-opentau-libero') or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-core", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "pyobjc-framework-cocoa", marker = "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32' and extra != 'extra-7-opentau-libero') or (platform_machine != 'AMD64' and platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'AMD64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (platform_machine == 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or sys_platform == 'darwin' or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32' and extra != 'extra-7-opentau-libero') or (sys_platform != 'win32' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'emscripten' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform == 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/94/18/cc59f3d4355c9456fc945eae7fe8797003c4da99212dd531ad1b0de8a0c6/pyobjc_framework_quartz-12.1.tar.gz", hash = "sha256:27f782f3513ac88ec9b6c82d9767eef95a5cf4175ce88a1e5a65875fee799608", size = 3159099, upload-time = "2025-11-14T10:21:24.31Z" } wheels = [ @@ -2787,7 +2814,7 @@ name = "pytest" version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, { name = "exceptiongroup" }, { name = "iniconfig" }, { name = "packaging" }, @@ -2999,9 +3026,11 @@ version = "0.23.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", - "platform_machine != 'aarch64' and sys_platform == 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "sys_platform == 'darwin'", - "sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ @@ -3024,16 +3053,18 @@ name = "rerun-sdk" version = "0.28.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "sys_platform == 'linux'", - "sys_platform != 'emscripten' and sys_platform != 'linux'", + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine != 'x86_64' and sys_platform == 'linux'", + "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')", + "(platform_machine != 'AMD64' and platform_machine != 'x86_64' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')", "sys_platform == 'emscripten'", ] dependencies = [ - { name = "attrs" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, - { name = "pillow" }, - { name = "pyarrow" }, - { name = "typing-extensions" }, + { name = "attrs", marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, + { name = "pillow", marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, + { name = "pyarrow", marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, + { name = "typing-extensions", marker = "extra == 'extra-7-opentau-urdf' or extra != 'extra-7-opentau-libero'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/cd/7d/a86b9a2cf182942f15ce92aa2ebb30c55ccd9eb1f7d8ab6eecea5b929495/rerun_sdk-0.28.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:bbc573a74863f71d1f64dc386af8f7b5d92745828421a8968194ee805b9793f5", size = 108607081, upload-time = "2026-01-08T13:48:21.955Z" }, @@ -3462,6 +3493,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/1d/b5d63f1a6b824282b57f7b581810d20b7a28ca951f2d5b59f1eb0782c12b/tensorboardx-2.6.4-py3-none-any.whl", hash = "sha256:5970cf3a1f0a6a6e8b180ccf46f3fe832b8a25a70b86e5a237048a7c0beb18e2", size = 87201, upload-time = "2025-06-10T22:37:05.44Z" }, ] +[[package]] +name = "tensorrt" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tensorrt-cu13" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/8d/1b3ea6493ee07d221fdf655a936f6b9d7c4bebfad7c0fdb879440a4172ad/tensorrt-10.15.1.29.tar.gz", hash = "sha256:a78fb34aee9695b81a7485ac0648859b802ff1faaac4bde743d9c51d7493204b", size = 16701, upload-time = "2026-01-30T07:40:25.93Z" } + +[[package]] +name = "tensorrt-cu13" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tensorrt-cu13-bindings" }, + { name = "tensorrt-cu13-libs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/0b/ff3683ddf1960227fb2c6210e92ab83c26eda92091046c123d8dfc1adc93/tensorrt_cu13-10.15.1.29.tar.gz", hash = "sha256:60edcdf1a68526732ea613c309283af036f418f6ebcbc8e18d24566b74d776e0", size = 19084, upload-time = "2026-01-30T07:42:55.055Z" } + +[[package]] +name = "tensorrt-cu13-bindings" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/a9/a1c15fb4472f8d5a0cc9b24075dd14f00c69bd1d1f37dc4b8c685a2269f4/tensorrt_cu13_bindings-10.15.1.29-cp310-none-manylinux_2_28_x86_64.whl", hash = "sha256:af6a18dfe937d801474dbcf4a511771dc83991be9b2b1ef1cf519b8b631def46", size = 1141114, upload-time = "2026-01-29T21:00:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/08/ac/11352689bb6562a41cdd0d1a6671e36cd8d2bdc55b651078868ea1b82ef0/tensorrt_cu13_bindings-10.15.1.29-cp310-none-manylinux_2_35_aarch64.whl", hash = "sha256:04f4db7e418c24d913bb5c21a745b066747d80ec8fabe0921b70a259af284b83", size = 1152064, upload-time = "2026-01-29T21:00:55.526Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e3/577f9efa52a3191fbc8c13541ff0fbaa9c829c606ca0014ba279e47363c2/tensorrt_cu13_bindings-10.15.1.29-cp310-none-win_amd64.whl", hash = "sha256:5942b7b1fff3a7c1079e13e861766e86bf28825263debfd53333fbde286d692e", size = 890381, upload-time = "2026-01-29T20:59:30.766Z" }, +] + +[[package]] +name = "tensorrt-cu13-libs" +version = "10.15.1.29" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/dd/745dacecd032db5720e8bacfbbb436319eb49b621142414b3abf19cafd9a/tensorrt_cu13_libs-10.15.1.29.tar.gz", hash = "sha256:d07fe8b65ce7edb94e805d0b6e9653afe742610b7d5e1b270c918bc9e58a36b1", size = 681, upload-time = "2026-01-29T20:58:43.318Z" } + [[package]] name = "termcolor" version = "3.3.0" @@ -3552,28 +3618,28 @@ name = "torch" version = "2.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-bindings", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "cuda-bindings", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvshmem-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cuda-cupti-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cuda-runtime-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cudnn-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cufft-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cufile-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-curand-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cusolver-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-cusparselt-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-nccl-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-nvshmem-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, + { name = "nvidia-nvtx-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf') or (sys_platform != 'linux' and extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, { name = "typing-extensions" }, ] wheels = [ @@ -3614,7 +3680,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-7-opentau-libero' and extra == 'extra-7-opentau-urdf')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ From b2258356b97cdfc7c18d87f3b77f719cf7d23e92 Mon Sep 17 00:00:00 2001 From: Shuheng Liu Date: Wed, 4 Feb 2026 16:10:49 -0800 Subject: [PATCH 7/7] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/opentau/scripts/export_to_onnx.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/opentau/scripts/export_to_onnx.py b/src/opentau/scripts/export_to_onnx.py index e82588f..6afd4d7 100644 --- a/src/opentau/scripts/export_to_onnx.py +++ b/src/opentau/scripts/export_to_onnx.py @@ -75,7 +75,6 @@ def __init__(self, policy: PI05Policy): Args: policy: The PI05Policy to wrap. - num_cameras: Number of camera inputs. """ super().__init__() self.policy = policy