Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions tests/ndarray_adapters_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,15 +144,40 @@ def test_adapter_positional_numpy_consistency(self, array_type, dtype):
for fast in (True, False):
with self.subTest("summary_fast" if fast else "summary_slow"):
summary_info_np = helpers.ensure_text(
np_adapter.get_array_summary(array_np, fast=True)
np_adapter.get_array_summary(array_np, fast=fast)
)
summary_info = helpers.ensure_text(
cur_adapter.get_array_summary(array, fast=True)
cur_adapter.get_array_summary(array, fast=fast)
)
self.assertEqual(
summary_info_np.split(" ", 1)[1], summary_info.split(" ", 1)[1]
)

@parameterized.product(
array_type=["numpy", "jax", "torch"],
values=[
[1.0, 5.0],
[3.0],
[1.0, 5.0, np.nan],
[1.0, 5.0, np.nan, np.inf, -np.inf],
],
)
def test_array_summary_standard_deviation(self, array_type, values):
array_np = np.array(values, dtype=np.float32)
if array_type == "numpy":
array = array_np
elif array_type == "jax":
array = jnp.array(array_np)
else:
array = torch.tensor(array_np)

adapter = type_registries.lookup_ndarray_adapter(array)
summary = helpers.ensure_text(adapter.get_array_summary(array, fast=False))
finite_values = array_np[np.isfinite(array_np)]
expected_mean = float(np.mean(finite_values))
expected_std = float(np.std(finite_values))
self.assertIn(f" ≈{expected_mean:.2} ±{expected_std:.2}", summary)

def test_pytorch_named_axes_info(self):
if not hasattr(torch.Tensor, "rename"):
self.skipTest("PyTorch named tensors are not supported in this version")
Expand Down
30 changes: 15 additions & 15 deletions tests/renderer_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,11 +413,11 @@ def hook_that_crashes(node, path, node_renderer):
np.arange(3 * 7, dtype=np.float32).reshape((3, 7))
).requires_grad_(),
expected_collapsed=(
"""<torch.Tensor float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True>"""
"""<torch.Tensor float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True>"""
),
expected_expanded=textwrap.dedent(
"""\
# torch.Tensor float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True
# torch.Tensor float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True
tensor([[ 0., 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12., 13.],
[14., 15., 16., 17., 18., 19., 20.]], requires_grad=True)"""
Expand All @@ -429,11 +429,11 @@ def hook_that_crashes(node, path, node_renderer):
torch.tensor(np.arange(3 * 7, dtype=np.float32).reshape((3, 7)))
),
expected_collapsed=(
"""<torch.Tensor float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True grad=<Tensor>>"""
"""<torch.Tensor float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True grad=<Tensor>>"""
),
expected_expanded=textwrap.dedent(
"""\
# torch.Tensor float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True grad=<Tensor>
# torch.Tensor float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=True grad=<Tensor>
tensor([[ 0., 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12., 13.],
[14., 15., 16., 17., 18., 19., 20.]], requires_grad=True)"""
Expand All @@ -445,11 +445,11 @@ def hook_that_crashes(node, path, node_renderer):
torch.tensor(np.arange(3 * 7, dtype=np.float32).reshape((3, 7)))
),
expected_collapsed=(
"""<torch.nn.Parameter float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20>"""
"""<torch.nn.Parameter float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20>"""
),
expected_expanded=textwrap.dedent(
"""\
# torch.nn.Parameter float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20
# torch.nn.Parameter float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20
Parameter containing:
tensor([[ 0., 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12., 13.],
Expand All @@ -462,10 +462,10 @@ def hook_that_crashes(node, path, node_renderer):
torch.tensor(np.arange(3 * 7, dtype=np.float32).reshape((3, 7)))
).requires_grad_(False),
expected_collapsed=(
"""<torch.nn.Parameter float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=False>"""
"""<torch.nn.Parameter float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=False>"""
),
expected_expanded=textwrap.dedent("""\
# torch.nn.Parameter float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=False
# torch.nn.Parameter float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20 requires_grad=False
Parameter containing:
tensor([[ 0., 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12., 13.],
Expand Down Expand Up @@ -602,9 +602,9 @@ def hook_that_crashes(node, path, node_renderer):
" foo=<torch.nn.Parameter float32(5,) ≈1.0 ±0.0 [≥1.0, ≤1.0]"
" nonzero:5>, bar=torch.tensor([0., 0., 0., 0., 0.]),"
" linear=Linear(in_features=10, out_features=10, training=True,"
" weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.028"
" weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.17"
" [≥-0.32, ≤0.3] nonzero:100>, bias=<torch.nn.Parameter"
" float32(10,) ≈0.008 ±0.04 [≥-0.31, ≤0.31] nonzero:10>, ),"
" float32(10,) ≈0.008 ±0.2 [≥-0.31, ≤0.31] nonzero:10>, ),"
" mod_list=ModuleList(training=True, (0):"
" LayerNorm(normalized_shape=(10,), eps=1e-05,"
" elementwise_affine=True, training=True,"
Expand All @@ -621,7 +621,7 @@ def hook_that_crashes(node, path, node_renderer):
# Buffers:
bar=torch.tensor([0., 0., 0., 0., 0.]),
# Child modules:
linear=Linear(in_features=10, out_features=10, training=True, weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.028 [≥-0.32, ≤0.3] nonzero:100>, bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.04 [≥-0.31, ≤0.31] nonzero:10>, ),
linear=Linear(in_features=10, out_features=10, training=True, weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.17 [≥-0.32, ≤0.3] nonzero:100>, bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.2 [≥-0.31, ≤0.31] nonzero:10>, ),
mod_list=ModuleList(training=True, (0): LayerNorm(normalized_shape=(10,), eps=1e-05, elementwise_affine=True, training=True, weight=<torch.nn.Parameter float32(10,) ≈1.0 ±0.0 [≥1.0, ≤1.0] nonzero:10>, bias=<torch.nn.Parameter float32(10,) ≈0.0 ±0.0 [≥0.0, ≤0.0] zero:10>, ), (1): SiLU(inplace=False, training=True, ), ),
)"""),
expected_roundtrip=textwrap.dedent("""\
Expand All @@ -632,7 +632,7 @@ def hook_that_crashes(node, path, node_renderer):
# Buffers:
bar=torch.tensor([0., 0., 0., 0., 0.]),
# Child modules:
linear=<torch.nn.modules.linear.Linear(in_features=10, out_features=10, training=True, weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.028 [≥-0.32, ≤0.3] nonzero:100>, bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.04 [≥-0.31, ≤0.31] nonzero:10>, )>,
linear=<torch.nn.modules.linear.Linear(in_features=10, out_features=10, training=True, weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.17 [≥-0.32, ≤0.3] nonzero:100>, bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.2 [≥-0.31, ≤0.31] nonzero:10>, )>,
mod_list=<torch.nn.modules.container.ModuleList(training=True, (0): <torch.nn.modules.normalization.LayerNorm(normalized_shape=(10,), eps=1e-05, elementwise_affine=True, training=True, weight=<torch.nn.Parameter float32(10,) ≈1.0 ±0.0 [≥1.0, ≤1.0] nonzero:10>, bias=<torch.nn.Parameter float32(10,) ≈0.0 ±0.0 [≥0.0, ≤0.0] zero:10>, )>, (1): <torch.nn.modules.activation.SiLU(inplace=False, training=True, )>, )>,
)>"""),
),
Expand All @@ -657,8 +657,8 @@ def hook_that_crashes(node, path, node_renderer):
linear=Linear(
in_features=10, out_features=10, training=True,
# Parameters:
weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.028 [≥-0.32, ≤0.3] nonzero:100>,
bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.04 [≥-0.31, ≤0.31] nonzero:10>,
weight=<torch.nn.Parameter float32(10, 10) ≈-0.008 ±0.17 [≥-0.32, ≤0.3] nonzero:100>,
bias=<torch.nn.Parameter float32(10,) ≈0.008 ±0.2 [≥-0.31, ≤0.31] nonzero:10>,
),
mod_list=ModuleList(
training=True,
Expand Down Expand Up @@ -939,7 +939,7 @@ def hook_that_crashes(node, path, node_renderer):
expected_collapsed="[<Param float32(3, 7)>]",
expected_expanded=textwrap.dedent("""\
[
<torch.nn.Parameter float32(3, 7) ≈1e+01 ±3.7e+01 [≥0.0, ≤2e+01] zero:1 nonzero:20>,
<torch.nn.Parameter float32(3, 7) ≈1e+01 ±6.1 [≥0.0, ≤2e+01] zero:1 nonzero:20>,
]"""),
),
)
Expand Down
2 changes: 1 addition & 1 deletion treescope/external/torch_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ def get_array_summary(
any_finite = torch.any(isfinite)
inf_to_nan = torch.where(isfinite, array, torch.nan)
mean = torch.nanmean(inf_to_nan)
std = torch.nanmean(torch.square(inf_to_nan - mean))
std = torch.sqrt(torch.nanmean(torch.square(inf_to_nan - mean)))

if any_finite:
summary_parts.append(f" ≈{float(mean):.2} ±{float(std):.2}")
Expand Down
Loading