Any3D-VLA -- Enhancing VLA Robustness via Diverse Point Clouds
| Field |
Value |
| Paper |
Any3D-VLA: Enhancing VLA Robustness via Diverse Point Clouds |
| Authors |
Xianzhe Fan, Shengliang Deng, Xiaoyang Wu, Yuxiang Lu, Zhuoling Li, Mi Yan, Yujia Zhang, Zhizheng Zhang, He Wang, Hengshuang Zhao |
| Year/Venue |
2026, arXiv |
| Repo |
XianzheFan/Any3D-VLA |
| Weights |
HuggingFace: XianzheFan/Any3D-VLA |
| Real-world controller |
XianzheFan/Any3D-VLA-real-world-controller |
| License |
See repo |
Problem & Contribution
VLA models using only 2D images have limited spatial understanding. Any3D-VLA incorporates 3D point clouds to enhance robustness by:
- Unifying diverse point cloud sources -- simulator-generated, real sensor, and model-estimated (monocular depth) point clouds in one training pipeline
- Domain-agnostic 3D feature learning -- gated residual fusion of Concerto (3D encoder) features with DINOv2+SigLIP (2D) features to mitigate depth-scale and cross-environment domain gaps
- CoT + flow matching -- chain-of-thought autoregressive generation (bbox/goal tokens) followed by flow-matching-based action generation
Architecture Overview
Language Instruction
|
v
Input Images (front+wrist) --> DINOv2 + SigLIP ViT --> 2D features (L patches, dim=2304)
|
Depth Maps --> Monocular Depth Estimator --> Point Cloud |
(or simulator/sensor point cloud) | |
v |
Concerto (3D encoder) |
(PTv3-based, dim=1728) |
| |
v v
Gated Residual Fusion ---------> Fused Features (dim=2304)
|
v
FusedMLPProjector --> LLM dim
|
v
InternLM2 1.8B (LLM backbone)
| |
v v
CoT tokens Action Expert (smaller LLM)
(bbox, goal) |
v
Flow Matching Module
|
v
Action (7-DoF x chunk_len)
Key Components
1. 2D Backbone: DINOv2 + SigLIP (ConcertoDinoSigLIPViTMonoBackbone)
| Detail |
Value |
| File |
vla_network/model/backbone_2d/dinosiglip_vit_simulated_concerto_mono.py |
| Class |
ConcertoDinoSigLIPViTMonoBackbone |
| DINOv2 model |
vit_large_patch14_reg4_dinov2.lvd142m (timm) |
| SigLIP model |
vit_so400m_patch14_siglip_224 (timm) |
| Image size |
224x224 |
| Feature dim |
2304 (DINOv2 1024 + SigLIP 1152, after removing CLS, concat) |
| Frozen |
Yes (by default) |
2. 3D Backbone: Concerto (PCEncoder32)
| Detail |
Value |
| File |
vla_network/model/backbone_2d/dinosiglip_vit_simulated_concerto_mono.py |
| Model |
concerto.load("concerto_large", repo_id="Pointcept/Concerto") |
| Feature dim |
1728 (after pooling hierarchy unroll) |
| Partial unfreeze |
Last 4 spconv layers trainable |
| Point format |
coord(3) + color(3) + normal(3) + grid(3) + cam_id(1) + patch_idx(1) + batch(1) = 15 dims |
| Grid size |
0.01 |
| Input struct |
concerto.structure.Point dict with keys: coord, color, normal, feat, grid_coord, batch |
3. Gated Residual Fusion
# Learnable gate initialized at sigmoid(-2.1972) ~ 0.1
fuse_gate = nn.Parameter(torch.full((1,), -2.1972))
# Fusion: image_feat + sigmoid(gate) * LayerNorm(MLP(cat(pc_feat, image_feat)))
fused = image_feats + sigmoid(fuse_gate) * fuse_ln(fuse_mlp(cat(pc_feats, image_feats)))
When no point cloud is available, empty_pc_token (learned parameter) is used as fallback.
4. Projector (FusedMLPProjector)
| Detail |
Value |
| File |
vla_network/model/vla/projector.py |
| Architecture |
Linear(2304, 9216) -> GELU -> Linear(9216, llm_dim) -> GELU -> Linear(llm_dim, llm_dim) |
5. LLM Backbone (LLMBackbone)
| Detail |
Value |
| File |
vla_network/model/backbone_llm/__init__.py |
| Default model |
InternLM2 1.8B (internlm/internlm2-1_8b) |
| Also supports |
LLaMA-2-7B, Qwen2-1.5B |
| Attention |
flex_attention (for action expert block-attention) |
| Dtype |
bfloat16 |
6. Action Expert
A smaller LLM (same architecture, scaled down hidden/intermediate sizes) that processes action tokens with cross-attention (via KV cache) to the main LLM's prefix output.
| Detail |
Value |
| File |
vla_network/model/vla/__init__.py:109 (create_action_expert_from_llm) |
| Config |
hidden_size_scale, intermediate_size_scale (divisors of LLM dims) |
| Attention |
flex_attention (enforced) |
7. Flow Matching Module (VLAFlowMatchingModule)
| Detail |
Value |
| File |
vla_network/model/vla/flow_matching.py |
| Class |
VLAFlowMatchingModule |
| Time sampling |
Beta distribution with params beta_alpha, beta_beta, scaled to [time_min, time_max] |
| Action embedding |
Linear(action_dim, llm_dim) + time MLP: Linear(2*llm_dim, llm_dim) -> SiLU -> Linear(llm_dim, llm_dim) |
| Proprio embedding |
Linear(proprio_dim, llm_dim) |
| Output projection |
Linear(llm_dim, action_dim) |
| Denoising |
Euler integration, default 10 steps at inference |
| Flow |
x_t = t * noise + (1-t) * x_1; velocity u_t = noise - x_1 |
8. Prediction Modes
| Mode |
Description |
flow_matching |
Pure flow matching action generation |
cot_flow_matching |
Default: autoregressive CoT (bbox + goal tokens) then flow matching for actions |
cot_bbox_flow_matching |
CoT with bbox only, then flow matching |
cotrain_flow_matching |
Co-training variant |
token_pred |
Pure autoregressive token prediction for actions |
9. Point Cloud Preprocessing (in DataPreprocessor)
| Detail |
Value |
| File |
vla_network/dataset/preprocess.py |
| Depth estimation |
DepthAnything3 (depth_anything_3.api.DepthAnything3) or MapAnything |
| PC from depth |
Lifts depth map to point cloud using camera intrinsics |
| Concerto transform |
GridSample(0.01) -> NormalizeColor -> ToTensor |
| Each point gets |
xyz, rgb, normal, grid_coord, cam_id, patch_idx (which ViT patch), batch_idx |
Paper-Code Mapping
| Paper Concept |
Code Location |
| 2D+3D backbone fusion |
backbone_2d/dinosiglip_vit_simulated_concerto_mono.py:ConcertoDinoSigLIPViTMonoBackbone.forward() |
| Concerto 3D encoder |
concerto package, loaded via concerto.load("concerto_large") |
| Gated residual fusion |
dinosiglip_vit_simulated_concerto_mono.py:141-148 (fuse_ln, fuse_mlp, fuse_gate) |
| Domain-agnostic 3D learning |
Diverse PC sources (sim/sensor/model-estimated) + partial Concerto fine-tuning (last 4 spconv layers) |
| CoT generation |
vla/__init__.py:VLA.generate() -> generate_autoregressive() for CoT tokens |
| Flow matching action gen |
vla/__init__.py:VLA.generate_flow_matching() using VLAFlowMatchingModule |
| Action expert |
vla/__init__.py:VLA.create_action_expert_from_llm() -- smaller LLM with KV cache from main LLM |
| Action tokenizer |
dataset/tokenizer.py:RatioMinMaxUniformRobotTokenizer (normalize then uniform discretize) |
| Inference server |
scripts/serve.py -- ZMQ-based server, VLAAgent wraps full pipeline |
Key Hyperparameters
| Parameter |
Default/Typical |
Source |
| Image size |
224 |
backbone config |
| Action dim |
7 (xyz, rpy, gripper) |
data config |
| Proprio dim |
7 or 13 (depends on robot_rep) |
data config |
| Action chunk length |
set in model config |
VLAModelConfig.action_len |
| Flow matching iterations (inference) |
10 |
VLA.generate(flow_matching_iter=10) |
| Grid size (Concerto) |
0.01 |
preprocessing |
| LLM |
InternLM2 1.8B |
VLAModelConfig.llm.name |
| Attention |
flex_attention |
LLMConfig.attn_implementation |
| Training |
DeepSpeed, bf16 |
BasicTrainConfig |
Dependencies
| Package |
Version |
Purpose |
| Python |
3.12 |
Runtime |
| CUDA |
11.8 |
GPU |
| PyTorch |
2.5.1 |
Framework |
| timm |
1.0.15 |
DINOv2/SigLIP ViT models |
| transformers |
4.47.0 |
LLM backbone |
| flash-attn |
2.7.0 |
Efficient attention |
| concerto |
(Pointcept) |
3D point cloud encoder |
| depth_anything_3 |
(bundled) |
Monocular depth estimation |
| torch_scatter |
- |
Scatter operations for PC->patch aggregation |
| spconv |
- |
Sparse convolution (Concerto dependency) |
| accelerate |
1.5.1 |
Training |
| deepspeed |
0.16.4 |
Distributed training |
| wandb |
0.19.8 |
Logging |
| zmq (pyzmq) |
26.3.0 |
Inference server communication |
Installation
conda create -n any3dvla_env python=3.12 -y
conda activate any3dvla_env
pip install -r requirements.txt --index-url https://download.pytorch.org/whl/cu118
# Install core package
pip install -e src/vla_network
# Install Concerto (3D encoder)
git clone https://github.com/Pointcept/Concerto.git
cd Concerto && pip install -e . && cd ..
Inference
Server mode (ZMQ)
# Download checkpoint from HuggingFace: XianzheFan/Any3D-VLA
# Expected path: storage/ckpt/exp/grit-Concerto-mono-dinosiglip-16-128-40000/checkpoint-340000/model.safetensors
bash serve_mono.sh # default port 6666
bash serve_mono.sh --compile # ~50% faster inference, ~3min warmup
Python API
from vla_network.model.vla import VLAAgent
import numpy as np
# Load model
agent = VLAAgent(path="path/to/model.safetensors", compile=False)
agent.preprocessor.config.robot_rep = "identity"
# Prepare input
sample = {
'text': 'pick up elephant',
'image_array': [np.zeros((256, 256, 3), dtype=np.uint8)], # front camera
'image_wrist_array': [np.zeros((256, 256, 3), dtype=np.uint8)], # wrist camera
'depth_array': [np.zeros((256, 256, 1), dtype=np.float32)],
'depth_wrist_array': [np.zeros((256, 256, 1), dtype=np.float32)],
'proprio_array': [np.zeros((7,), dtype=np.float32)] * 4, # 4 history steps
'traj_metadata': None,
'env_id': 1,
}
# Get action
results = agent([sample])
# results[0]['action']: np.ndarray of shape (action_len * dt_steps, 7)
# columns: [dx, dy, dz, droll, dpitch, dyaw, gripper]
# results[0].get('goal'): (xyz, rpy) tuple if CoT mode
# results[0].get('bbox'): bounding boxes if CoT mode
Supported instructions
pick up {object}
pick up {color} {object}
stack {color} bowl onto {color} bowl
stack {color} cube onto {color} cube
move {object} to {container}
move {object} to {color} {container}
Gotchas & Tips
- flex_attention required for action expert -- the code enforces this; if your LLM doesn't support it, you must use a non-action-expert config
- Concerto runs in float32 -- wrapped in
PCEncoder32 to prevent dtype casting issues with mixed precision training
- Point cloud preprocessing is heavy -- the
DataPreprocessor runs monocular depth estimation (DepthAnything3) at inference time if real depth is not available
- serve_mono.sh sets
HF_ENDPOINT to hf-mirror.com -- change this for non-China networks
gx_utils -- the code depends on a private gx_utils package for logging, file management, robot configs, and data types; this is bundled with the checkpoint/config but not in the public repo
- Action interpolation -- at inference, predicted delta actions are interpolated by
dt_steps using axis-angle decomposition (transforms3d)
- Gripper discretization -- predicted gripper values are discretized to {-1, 0, 1} at inference
1---2name: paper-rob-any3d-vla3description: Any3D-VLA -- Enhancing VLA Robustness via Diverse Point Clouds4---5# Any3D-VLA -- Enhancing VLA Robustness via Diverse Point Clouds67| Field | Value |8|-------|-------|9| Paper | [Any3D-VLA: Enhancing VLA Robustness via Diverse Point Clouds](https://arxiv.org/abs/2602.00807) |10| Authors | Xianzhe Fan, Shengliang Deng, Xiaoyang Wu, Yuxiang Lu, Zhuoling Li, Mi Yan, Yujia Zhang, Zhizheng Zhang, He Wang, Hengshuang Zhao |11| Year/Venue | 2026, arXiv |12| Repo | [XianzheFan/Any3D-VLA](https://github.com/XianzheFan/Any3D-VLA) |13| Weights | [HuggingFace: XianzheFan/Any3D-VLA](https://huggingface.co/XianzheFan/Any3D-VLA) |14| Real-world controller | [XianzheFan/Any3D-VLA-real-world-controller](https://github.com/XianzheFan/Any3D-VLA-real-world-controller) |15| License | See repo |1617## Problem & Contribution1819VLA models using only 2D images have limited spatial understanding. Any3D-VLA incorporates 3D point clouds to enhance robustness by:20211. **Unifying diverse point cloud sources** -- simulator-generated, real sensor, and model-estimated (monocular depth) point clouds in one training pipeline222. **Domain-agnostic 3D feature learning** -- gated residual fusion of Concerto (3D encoder) features with DINOv2+SigLIP (2D) features to mitigate depth-scale and cross-environment domain gaps233. **CoT + flow matching** -- chain-of-thought autoregressive generation (bbox/goal tokens) followed by flow-matching-based action generation2425## Architecture Overview2627```28 Language Instruction29 |30 v31Input Images (front+wrist) --> DINOv2 + SigLIP ViT --> 2D features (L patches, dim=2304)32 |33Depth Maps --> Monocular Depth Estimator --> Point Cloud |34 (or simulator/sensor point cloud) | |35 v |36 Concerto (3D encoder) |37 (PTv3-based, dim=1728) |38 | |39 v v40 Gated Residual Fusion ---------> Fused Features (dim=2304)41 |42 v43 FusedMLPProjector --> LLM dim44 |45 v46 InternLM2 1.8B (LLM backbone)47 | |48 v v49 CoT tokens Action Expert (smaller LLM)50 (bbox, goal) |51 v52 Flow Matching Module53 |54 v55 Action (7-DoF x chunk_len)56```5758## Key Components5960### 1. 2D Backbone: DINOv2 + SigLIP (`ConcertoDinoSigLIPViTMonoBackbone`)6162| Detail | Value |63|--------|-------|64| File | `vla_network/model/backbone_2d/dinosiglip_vit_simulated_concerto_mono.py` |65| Class | `ConcertoDinoSigLIPViTMonoBackbone` |66| DINOv2 model | `vit_large_patch14_reg4_dinov2.lvd142m` (timm) |67| SigLIP model | `vit_so400m_patch14_siglip_224` (timm) |68| Image size | 224x224 |69| Feature dim | 2304 (DINOv2 1024 + SigLIP 1152, after removing CLS, concat) |70| Frozen | Yes (by default) |7172### 2. 3D Backbone: Concerto (`PCEncoder32`)7374| Detail | Value |75|--------|-------|76| File | `vla_network/model/backbone_2d/dinosiglip_vit_simulated_concerto_mono.py` |77| Model | `concerto.load("concerto_large", repo_id="Pointcept/Concerto")` |78| Feature dim | 1728 (after pooling hierarchy unroll) |79| Partial unfreeze | Last 4 spconv layers trainable |80| Point format | coord(3) + color(3) + normal(3) + grid(3) + cam_id(1) + patch_idx(1) + batch(1) = 15 dims |81| Grid size | 0.01 |82| Input struct | `concerto.structure.Point` dict with keys: coord, color, normal, feat, grid_coord, batch |8384### 3. Gated Residual Fusion8586```python87# Learnable gate initialized at sigmoid(-2.1972) ~ 0.188fuse_gate = nn.Parameter(torch.full((1,), -2.1972))89# Fusion: image_feat + sigmoid(gate) * LayerNorm(MLP(cat(pc_feat, image_feat)))90fused = image_feats + sigmoid(fuse_gate) * fuse_ln(fuse_mlp(cat(pc_feats, image_feats)))91```9293When no point cloud is available, `empty_pc_token` (learned parameter) is used as fallback.9495### 4. Projector (`FusedMLPProjector`)9697| Detail | Value |98|--------|-------|99| File | `vla_network/model/vla/projector.py` |100| Architecture | Linear(2304, 9216) -> GELU -> Linear(9216, llm_dim) -> GELU -> Linear(llm_dim, llm_dim) |101102### 5. LLM Backbone (`LLMBackbone`)103104| Detail | Value |105|--------|-------|106| File | `vla_network/model/backbone_llm/__init__.py` |107| Default model | InternLM2 1.8B (`internlm/internlm2-1_8b`) |108| Also supports | LLaMA-2-7B, Qwen2-1.5B |109| Attention | `flex_attention` (for action expert block-attention) |110| Dtype | bfloat16 |111112### 6. Action Expert113114A smaller LLM (same architecture, scaled down hidden/intermediate sizes) that processes action tokens with cross-attention (via KV cache) to the main LLM's prefix output.115116| Detail | Value |117|--------|-------|118| File | `vla_network/model/vla/__init__.py:109` (`create_action_expert_from_llm`) |119| Config | `hidden_size_scale`, `intermediate_size_scale` (divisors of LLM dims) |120| Attention | `flex_attention` (enforced) |121122### 7. Flow Matching Module (`VLAFlowMatchingModule`)123124| Detail | Value |125|--------|-------|126| File | `vla_network/model/vla/flow_matching.py` |127| Class | `VLAFlowMatchingModule` |128| Time sampling | Beta distribution with params `beta_alpha`, `beta_beta`, scaled to `[time_min, time_max]` |129| Action embedding | `Linear(action_dim, llm_dim)` + time MLP: `Linear(2*llm_dim, llm_dim) -> SiLU -> Linear(llm_dim, llm_dim)` |130| Proprio embedding | `Linear(proprio_dim, llm_dim)` |131| Output projection | `Linear(llm_dim, action_dim)` |132| Denoising | Euler integration, default 10 steps at inference |133| Flow | `x_t = t * noise + (1-t) * x_1`; velocity `u_t = noise - x_1` |134135### 8. Prediction Modes136137| Mode | Description |138|------|-------------|139| `flow_matching` | Pure flow matching action generation |140| `cot_flow_matching` | **Default**: autoregressive CoT (bbox + goal tokens) then flow matching for actions |141| `cot_bbox_flow_matching` | CoT with bbox only, then flow matching |142| `cotrain_flow_matching` | Co-training variant |143| `token_pred` | Pure autoregressive token prediction for actions |144145### 9. Point Cloud Preprocessing (in `DataPreprocessor`)146147| Detail | Value |148|--------|-------|149| File | `vla_network/dataset/preprocess.py` |150| Depth estimation | DepthAnything3 (`depth_anything_3.api.DepthAnything3`) or MapAnything |151| PC from depth | Lifts depth map to point cloud using camera intrinsics |152| Concerto transform | GridSample(0.01) -> NormalizeColor -> ToTensor |153| Each point gets | xyz, rgb, normal, grid_coord, cam_id, patch_idx (which ViT patch), batch_idx |154155## Paper-Code Mapping156157| Paper Concept | Code Location |158|---------------|---------------|159| 2D+3D backbone fusion | `backbone_2d/dinosiglip_vit_simulated_concerto_mono.py:ConcertoDinoSigLIPViTMonoBackbone.forward()` |160| Concerto 3D encoder | `concerto` package, loaded via `concerto.load("concerto_large")` |161| Gated residual fusion | `dinosiglip_vit_simulated_concerto_mono.py:141-148` (fuse_ln, fuse_mlp, fuse_gate) |162| Domain-agnostic 3D learning | Diverse PC sources (sim/sensor/model-estimated) + partial Concerto fine-tuning (last 4 spconv layers) |163| CoT generation | `vla/__init__.py:VLA.generate()` -> `generate_autoregressive()` for CoT tokens |164| Flow matching action gen | `vla/__init__.py:VLA.generate_flow_matching()` using `VLAFlowMatchingModule` |165| Action expert | `vla/__init__.py:VLA.create_action_expert_from_llm()` -- smaller LLM with KV cache from main LLM |166| Action tokenizer | `dataset/tokenizer.py:RatioMinMaxUniformRobotTokenizer` (normalize then uniform discretize) |167| Inference server | `scripts/serve.py` -- ZMQ-based server, `VLAAgent` wraps full pipeline |168169## Key Hyperparameters170171| Parameter | Default/Typical | Source |172|-----------|----------------|--------|173| Image size | 224 | backbone config |174| Action dim | 7 (xyz, rpy, gripper) | data config |175| Proprio dim | 7 or 13 (depends on `robot_rep`) | data config |176| Action chunk length | set in model config | `VLAModelConfig.action_len` |177| Flow matching iterations (inference) | 10 | `VLA.generate(flow_matching_iter=10)` |178| Grid size (Concerto) | 0.01 | preprocessing |179| LLM | InternLM2 1.8B | `VLAModelConfig.llm.name` |180| Attention | flex_attention | `LLMConfig.attn_implementation` |181| Training | DeepSpeed, bf16 | `BasicTrainConfig` |182183## Dependencies184185| Package | Version | Purpose |186|---------|---------|---------|187| Python | 3.12 | Runtime |188| CUDA | 11.8 | GPU |189| PyTorch | 2.5.1 | Framework |190| timm | 1.0.15 | DINOv2/SigLIP ViT models |191| transformers | 4.47.0 | LLM backbone |192| flash-attn | 2.7.0 | Efficient attention |193| concerto | (Pointcept) | 3D point cloud encoder |194| depth_anything_3 | (bundled) | Monocular depth estimation |195| torch_scatter | - | Scatter operations for PC->patch aggregation |196| spconv | - | Sparse convolution (Concerto dependency) |197| accelerate | 1.5.1 | Training |198| deepspeed | 0.16.4 | Distributed training |199| wandb | 0.19.8 | Logging |200| zmq (pyzmq) | 26.3.0 | Inference server communication |201202## Installation203204```bash205conda create -n any3dvla_env python=3.12 -y206conda activate any3dvla_env207208pip install -r requirements.txt --index-url https://download.pytorch.org/whl/cu118209210# Install core package211pip install -e src/vla_network212213# Install Concerto (3D encoder)214git clone https://github.com/Pointcept/Concerto.git215cd Concerto && pip install -e . && cd ..216```217218## Inference219220### Server mode (ZMQ)221222```bash223# Download checkpoint from HuggingFace: XianzheFan/Any3D-VLA224# Expected path: storage/ckpt/exp/grit-Concerto-mono-dinosiglip-16-128-40000/checkpoint-340000/model.safetensors225226bash serve_mono.sh # default port 6666227bash serve_mono.sh --compile # ~50% faster inference, ~3min warmup228```229230### Python API231232```python233from vla_network.model.vla import VLAAgent234import numpy as np235236# Load model237agent = VLAAgent(path="path/to/model.safetensors", compile=False)238agent.preprocessor.config.robot_rep = "identity"239240# Prepare input241sample = {242 'text': 'pick up elephant',243 'image_array': [np.zeros((256, 256, 3), dtype=np.uint8)], # front camera244 'image_wrist_array': [np.zeros((256, 256, 3), dtype=np.uint8)], # wrist camera245 'depth_array': [np.zeros((256, 256, 1), dtype=np.float32)],246 'depth_wrist_array': [np.zeros((256, 256, 1), dtype=np.float32)],247 'proprio_array': [np.zeros((7,), dtype=np.float32)] * 4, # 4 history steps248 'traj_metadata': None,249 'env_id': 1,250}251252# Get action253results = agent([sample])254# results[0]['action']: np.ndarray of shape (action_len * dt_steps, 7)255# columns: [dx, dy, dz, droll, dpitch, dyaw, gripper]256# results[0].get('goal'): (xyz, rpy) tuple if CoT mode257# results[0].get('bbox'): bounding boxes if CoT mode258```259260### Supported instructions261262- `pick up {object}`263- `pick up {color} {object}`264- `stack {color} bowl onto {color} bowl`265- `stack {color} cube onto {color} cube`266- `move {object} to {container}`267- `move {object} to {color} {container}`268269## Gotchas & Tips270271- **flex_attention required** for action expert -- the code enforces this; if your LLM doesn't support it, you must use a non-action-expert config272- **Concerto runs in float32** -- wrapped in `PCEncoder32` to prevent dtype casting issues with mixed precision training273- **Point cloud preprocessing is heavy** -- the `DataPreprocessor` runs monocular depth estimation (DepthAnything3) at inference time if real depth is not available274- **serve_mono.sh sets `HF_ENDPOINT` to hf-mirror.com** -- change this for non-China networks275- **`gx_utils`** -- the code depends on a private `gx_utils` package for logging, file management, robot configs, and data types; this is bundled with the checkpoint/config but not in the public repo276- **Action interpolation** -- at inference, predicted delta actions are interpolated by `dt_steps` using axis-angle decomposition (`transforms3d`)277- **Gripper discretization** -- predicted gripper values are discretized to {-1, 0, 1} at inference