Skip to content

Commit 2d1796a

Browse files
pre-commits
1 parent 01c3c2c commit 2d1796a

File tree

9 files changed

+168
-82
lines changed

9 files changed

+168
-82
lines changed

source/isaaclab/isaaclab/test/benchmark/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
16
""" Benchmarking utilities for IsaacLab.
27
38
This package provides benchmarking utilities used across different test modules.
@@ -43,4 +48,4 @@
4348
"print_hardware_info",
4449
"print_results",
4550
"benchmark_method",
46-
]
51+
]

source/isaaclab/isaaclab/test/benchmark/benchmark_core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
from __future__ import annotations
1313

1414
import contextlib
15-
import numpy as np
1615
import time
1716
from collections.abc import Callable
1817
from dataclasses import dataclass
1918

19+
import numpy as np
2020
import warp as wp
2121

2222

source/isaaclab/isaaclab/test/benchmark/benchmark_io.py

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717

1818
import contextlib
1919
import json
20-
import numpy as np
2120
import os
2221
import platform
2322
import subprocess
24-
import torch
2523
from datetime import datetime
2624
from typing import TYPE_CHECKING
2725

26+
import numpy as np
27+
import torch
2828
import warp as wp
2929

3030
if TYPE_CHECKING:
@@ -147,13 +147,15 @@ def get_hardware_info() -> dict:
147147

148148
for i in range(torch.cuda.device_count()):
149149
gpu_props = torch.cuda.get_device_properties(i)
150-
hardware_info["gpu"]["devices"].append({
151-
"index": i,
152-
"name": gpu_props.name,
153-
"total_memory_gb": round(gpu_props.total_memory / (1024**3), 2),
154-
"compute_capability": f"{gpu_props.major}.{gpu_props.minor}",
155-
"multi_processor_count": gpu_props.multi_processor_count,
156-
})
150+
hardware_info["gpu"]["devices"].append(
151+
{
152+
"index": i,
153+
"name": gpu_props.name,
154+
"total_memory_gb": round(gpu_props.total_memory / (1024**3), 2),
155+
"compute_capability": f"{gpu_props.major}.{gpu_props.minor}",
156+
"multi_processor_count": gpu_props.multi_processor_count,
157+
}
158+
)
157159

158160
# Current device info
159161
current_device = torch.cuda.current_device()
@@ -513,30 +515,34 @@ def export_results_csv(results: list[BenchmarkResult], filename: str):
513515

514516
with open(filename, "w", newline="") as csvfile:
515517
writer = csv.writer(csvfile)
516-
writer.writerow([
517-
"Name",
518-
"Mode",
519-
"Mean (µs)",
520-
"Std (µs)",
521-
"Iterations",
522-
"Dependencies",
523-
"Skipped",
524-
"Skip Reason",
525-
])
518+
writer.writerow(
519+
[
520+
"Name",
521+
"Mode",
522+
"Mean (µs)",
523+
"Std (µs)",
524+
"Iterations",
525+
"Dependencies",
526+
"Skipped",
527+
"Skip Reason",
528+
]
529+
)
526530

527531
for result in results:
528532
deps_str = ", ".join(result.dependencies) if result.dependencies else ""
529533
mode_str = result.mode if result.mode else ""
530-
writer.writerow([
531-
result.name,
532-
mode_str,
533-
f"{result.mean_time_us:.4f}" if not result.skipped else "",
534-
f"{result.std_time_us:.4f}" if not result.skipped else "",
535-
result.num_iterations,
536-
deps_str,
537-
result.skipped,
538-
result.skip_reason,
539-
])
534+
writer.writerow(
535+
[
536+
result.name,
537+
mode_str,
538+
f"{result.mean_time_us:.4f}" if not result.skipped else "",
539+
f"{result.std_time_us:.4f}" if not result.skipped else "",
540+
result.num_iterations,
541+
deps_str,
542+
result.skipped,
543+
result.skip_reason,
544+
]
545+
)
540546

541547
print(f"\nResults exported to {filename}")
542548

source/isaaclab_physx/benchmark/assets/benchmark_articulation.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
2. **Torch Tensor**: Inputs are PyTorch tensors with tensor indices.
1313
1414
Usage:
15-
python benchmark_articulation.py [--num_iterations N] [--warmup_steps W] [--num_instances I] [--num_bodies B] [--num_joints J]
15+
python benchmark_articulation.py [--num_iterations N] [--warmup_steps W]
16+
[--num_instances I] [--num_bodies B] [--num_joints J]
1617
1718
Example:
1819
python benchmark_articulation.py --num_iterations 1000 --warmup_steps 10
@@ -39,6 +40,7 @@
3940
# Mock Setup - Must happen BEFORE importing Articulation
4041
# =============================================================================
4142

43+
4244
class MockPhysicsSimView:
4345
"""Simple mock for the physics simulation view."""
4446

@@ -151,7 +153,10 @@ def __init__(self, root_view, device: str):
151153

152154
class ArticulationCfg:
153155
"""Mock ArticulationCfg for testing."""
154-
def __init__(self, prim_path: str = "/World/Robot", soft_joint_pos_limit_factor: float = 1.0, actuators: dict = None):
156+
157+
def __init__(
158+
self, prim_path: str = "/World/Robot", soft_joint_pos_limit_factor: float = 1.0, actuators: dict = None
159+
):
155160
self.prim_path = prim_path
156161
self.soft_joint_pos_limit_factor = soft_joint_pos_limit_factor
157162
self.actuators = actuators or {}
@@ -203,8 +208,12 @@ def __iter__(self):
203208
benchmark_dir = Path(__file__).resolve().parent
204209

205210
# Load ArticulationData
206-
articulation_data_path = benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "articulation" / "articulation_data.py"
207-
spec = importlib.util.spec_from_file_location("isaaclab_physx.assets.articulation.articulation_data", articulation_data_path)
211+
articulation_data_path = (
212+
benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "articulation" / "articulation_data.py"
213+
)
214+
spec = importlib.util.spec_from_file_location(
215+
"isaaclab_physx.assets.articulation.articulation_data", articulation_data_path
216+
)
208217
articulation_data_module = importlib.util.module_from_spec(spec)
209218
sys.modules["isaaclab_physx.assets.articulation.articulation_data"] = articulation_data_module
210219
spec.loader.exec_module(articulation_data_module)
@@ -219,6 +228,9 @@ def __iter__(self):
219228
Articulation = articulation_module.Articulation
220229

221230
# Import shared utilities from common module
231+
# Import mock classes from PhysX test utilities
232+
from isaaclab_physx.test.mock_interfaces.views import MockArticulationView
233+
222234
from isaaclab.test.benchmark import (
223235
BenchmarkConfig,
224236
MethodBenchmark,
@@ -234,15 +246,13 @@ def __iter__(self):
234246
print_results,
235247
)
236248

237-
# Import mock classes from PhysX test utilities
238-
from isaaclab_physx.test.mock_interfaces.views import MockArticulationView
239-
240249
# Suppress deprecation warnings during benchmarking
241250
warnings.filterwarnings("ignore", category=DeprecationWarning)
242251
warnings.filterwarnings("ignore", category=UserWarning)
243252

244253
# Also suppress logging warnings (the body_acc_w deprecation warnings use logging)
245254
import logging
255+
246256
logging.getLogger("isaaclab_physx").setLevel(logging.ERROR)
247257
logging.getLogger("isaaclab").setLevel(logging.ERROR)
248258

source/isaaclab_physx/benchmark/assets/benchmark_articulation_data.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
and timing statistics (mean and standard deviation) are reported.
1111
1212
Usage:
13-
python benchmark_articulation_data.py [--num_iterations N] [--warmup_steps W] [--num_instances I] [--num_bodies B] [--num_joints J]
13+
python benchmark_articulation_data.py [--num_iterations N] [--warmup_steps W]
14+
[--num_instances I] [--num_bodies B] [--num_joints J]
1415
1516
Example:
1617
python benchmark_articulation_data.py --num_iterations 10000 --warmup_steps 10
@@ -34,6 +35,7 @@
3435
# Mock Setup - Must happen BEFORE importing ArticulationData
3536
# =============================================================================
3637

38+
3739
class MockPhysicsSimView:
3840
"""Simple mock for the physics simulation view."""
3941

@@ -78,6 +80,7 @@ def __init__(self, root_view, device: str):
7880

7981
# Mock pxr (USD library - not available in headless docker, used by isaaclab.utils.mesh)
8082
from unittest.mock import MagicMock
83+
8184
sys.modules["pxr"] = MagicMock()
8285
sys.modules["pxr.Usd"] = MagicMock()
8386
sys.modules["pxr.UsdGeom"] = MagicMock()
@@ -87,20 +90,27 @@ def __init__(self, root_view, device: str):
8790
from pathlib import Path
8891

8992
benchmark_dir = Path(__file__).resolve().parent
90-
articulation_data_path = benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "articulation" / "articulation_data.py"
93+
articulation_data_path = (
94+
benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "articulation" / "articulation_data.py"
95+
)
9196

9297
spec = importlib.util.spec_from_file_location(
93-
"isaaclab_physx.assets.articulation.articulation_data",
94-
articulation_data_path
98+
"isaaclab_physx.assets.articulation.articulation_data", articulation_data_path
9599
)
96100
articulation_data_module = importlib.util.module_from_spec(spec)
97101
sys.modules["isaaclab_physx.assets.articulation.articulation_data"] = articulation_data_module
98102
spec.loader.exec_module(articulation_data_module)
99103
ArticulationData = articulation_data_module.ArticulationData
100104

101105
# Import shared utilities from common module
102-
from isaaclab.test.benchmark import BenchmarkConfig, BenchmarkResult, MethodBenchmark, benchmark_method
106+
# Import mock classes from PhysX test utilities
107+
from isaaclab_physx.test.mock_interfaces.views import MockArticulationView
108+
103109
from isaaclab.test.benchmark import (
110+
BenchmarkConfig,
111+
BenchmarkResult,
112+
MethodBenchmark,
113+
benchmark_method,
104114
export_results_csv,
105115
export_results_json,
106116
get_default_output_filename,
@@ -109,9 +119,6 @@ def __init__(self, root_view, device: str):
109119
print_results,
110120
)
111121

112-
# Import mock classes from PhysX test utilities
113-
from isaaclab_physx.test.mock_interfaces.views import MockArticulationView
114-
115122
# Suppress deprecation warnings during benchmarking
116123
warnings.filterwarnings("ignore", category=DeprecationWarning)
117124
warnings.filterwarnings("ignore", category=UserWarning)
@@ -257,6 +264,7 @@ def __init__(self, root_view, device: str):
257264
# Benchmark Functions
258265
# =============================================================================
259266

267+
260268
def get_benchmarkable_properties(articulation_data: ArticulationData) -> list[str]:
261269
"""Get list of properties that can be benchmarked."""
262270
all_properties = []
@@ -340,6 +348,7 @@ def gen_mock_data(cfg: BenchmarkConfig) -> dict:
340348
print("-" * 80)
341349

342350
for i, benchmark in enumerate(benchmarks):
351+
343352
def prop_accessor(prop=benchmark.method_name, **kwargs):
344353
return getattr(articulation_data, prop)
345354

source/isaaclab_physx/benchmark/assets/benchmark_rigid_object.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
# Mock Setup - Must happen BEFORE importing RigidObject
4040
# =============================================================================
4141

42+
4243
class MockPhysicsSimView:
4344
"""Simple mock for the physics simulation view."""
4445

@@ -149,8 +150,12 @@ def __init__(self, root_view, device: str):
149150
benchmark_dir = Path(__file__).resolve().parent
150151

151152
# Load RigidObjectData
152-
rigid_object_data_path = benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "rigid_object" / "rigid_object_data.py"
153-
spec = importlib.util.spec_from_file_location("isaaclab_physx.assets.rigid_object.rigid_object_data", rigid_object_data_path)
153+
rigid_object_data_path = (
154+
benchmark_dir.parents[1] / "isaaclab_physx" / "assets" / "rigid_object" / "rigid_object_data.py"
155+
)
156+
spec = importlib.util.spec_from_file_location(
157+
"isaaclab_physx.assets.rigid_object.rigid_object_data", rigid_object_data_path
158+
)
154159
rigid_object_data_module = importlib.util.module_from_spec(spec)
155160
sys.modules["isaaclab_physx.assets.rigid_object.rigid_object_data"] = rigid_object_data_module
156161
spec.loader.exec_module(rigid_object_data_module)
@@ -164,12 +169,17 @@ def __init__(self, root_view, device: str):
164169
spec.loader.exec_module(rigid_object_module)
165170
RigidObject = rigid_object_module.RigidObject
166171

172+
167173
# Simple RigidObjectCfg for testing
168174
class RigidObjectCfg:
169175
def __init__(self, prim_path: str = "/World/Object"):
170176
self.prim_path = prim_path
171177

178+
172179
# Import shared utilities from common module
180+
# Import mock classes from PhysX test utilities
181+
from isaaclab_physx.test.mock_interfaces.views import MockRigidBodyView
182+
173183
from isaaclab.test.benchmark import (
174184
BenchmarkConfig,
175185
MethodBenchmark,
@@ -178,21 +188,18 @@ def __init__(self, prim_path: str = "/World/Object"):
178188
export_results_json,
179189
get_default_output_filename,
180190
get_hardware_info,
181-
make_tensor_body_ids,
182191
make_tensor_env_ids,
183192
print_hardware_info,
184193
print_results,
185194
)
186195

187-
# Import mock classes from PhysX test utilities
188-
from isaaclab_physx.test.mock_interfaces.views import MockRigidBodyView
189-
190196
# Suppress deprecation warnings during benchmarking
191197
warnings.filterwarnings("ignore", category=DeprecationWarning)
192198
warnings.filterwarnings("ignore", category=UserWarning)
193199

194200
# Suppress isaaclab logging (deprecation warnings)
195201
import logging
202+
196203
logging.getLogger("isaaclab_physx").setLevel(logging.ERROR)
197204
logging.getLogger("isaaclab").setLevel(logging.ERROR)
198205

0 commit comments

Comments
 (0)