Skip to content

Array visualization fails for large, sharded arrays #70

Description

@colehaus

Hi,

When I try to visualize sharded arrays above a certain size like this:

mesh = jax.sharding.Mesh(mesh_utils.create_device_mesh((1,4)), axis_names=("dp", "tp"), axis_types=(jax.sharding.AxisType.Explicit,jax.sharding.AxisType.Explicit))
jax.device_put(jnp.zeros((5120, 5120)), jax.sharding.NamedSharding(mesh, jax.P("tp", None)))

I get the following error:

<ShardingTypeError during deferred rendering
Traceback (most recent call last):
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/lowering.py", line 381, in _render_to_html_as_root_streaming
    replacement_part = deferred.thunk(layout_decision)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/_internal/api/array_autovisualizer.py", line 286, in _thunk
    return self._autovisualize_array(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/_internal/api/array_autovisualizer.py", line 130, in _autovisualize_array
    adapter.get_array_data_with_truncation(
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/external/jax_support.py", line 521, in get_array_data_with_truncation
    array, mask = truncate_array_and_mask(array, mask, edge_items_per_axis)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/external/jax_support.py", line 252, in truncate_array_and_mask
    return fn(array, mask, (), edge_items_per_axis)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/traceback_util.py", line 180, in reraise_with_filtered_traceback
    return fun(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 260, in cache_miss
    _python_pjit_helper(fun, jit_info, *args, **kwargs)
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 137, in _python_pjit_helper
    p, args_flat = _infer_params(fun, jit_info, args, kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 629, in _infer_params
    return _infer_params_internal(fun, ji, args, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 653, in _infer_params_internal
    p, args_flat = _infer_params_impl(
                   ^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 552, in _infer_params_impl
    jaxpr, consts, jaxpr_for_top_jit, out_avals = _create_pjit_jaxpr(
                                                  ^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/linear_util.py", line 472, in memoized_fun
    ans = call(fun, *args)
          ^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/pjit.py", line 1350, in _create_pjit_jaxpr
    jaxpr, global_out_avals, consts = pe.trace_to_jaxpr_dynamic(fun, in_type)
                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/profiler.py", line 354, in wrapper
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/interpreters/partial_eval.py", line 2337, in trace_to_jaxpr_dynamic
    ans = fun.call_wrapped(*in_tracers)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/linear_util.py", line 212, in call_wrapped
    return self.f_transformed(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/api_util.py", line 73, in flatten_fun
    ans = f(*py_args, **py_kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/api_util.py", line 314, in _argnames_partial
    return _fun(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/api_util.py", line 288, in _argnums_partial
    return _fun(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/linear_util.py", line 397, in _get_result_paths_thunk
    ans = _fun(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/external/jax_support.py", line 172, in _truncate_part_with_slices
    result_a, valid_a = _truncate_part_with_slices(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/external/jax_support.py", line 172, in _truncate_part_with_slices
    result_a, valid_a = _truncate_part_with_slices(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/treescope/external/jax_support.py", line 146, in _truncate_part_with_slices
    truncated_array = array[prefix_slices]
                      ~~~~~^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/numpy/array_methods.py", line 1125, in op
    return getattr(self.aval, f"_{name}")(self, *args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/numpy/array_methods.py", line 660, in _getitem
    return indexing.rewriting_take(self, item)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/numpy/indexing.py", line 639, in rewriting_take
    result = _attempt_rewriting_take_via_slice(arr, idx, mode, out_sharding)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/numpy/indexing.py", line 602, in _attempt_rewriting_take_via_slice
    arr = slicing.slice(
          ^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/slicing.py", line 111, in slice
    return slice_p.bind(operand, start_indices=tuple(start_indices),
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/core.py", line 576, in bind
    return self._true_bind(*args, **params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/core.py", line 592, in _true_bind
    return self.bind_with_trace(prev_trace, args, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/core.py", line 602, in bind_with_trace
    return trace.process_primitive(self, args, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/interpreters/partial_eval.py", line 2062, in process_primitive
    return self.default_process_primitive(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/interpreters/partial_eval.py", line 2076, in default_process_primitive
    out_avals, effs = _cached_abstract_eval(primitive, *aval_qdds, **params)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/util.py", line 298, in wrapper
    return cached(config.trace_context() if trace_context_in_key else _ignore(),
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/util.py", line 292, in cached
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/interpreters/partial_eval.py", line 1900, in _cached_abstract_eval
    return primitive.abstract_eval(*aval_qdds, **params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/core.py", line 641, in abstract_eval_
    return abstract_eval(*args, **kwargs), no_effects
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/utils.py", line 139, in standard_abstract_eval
    out_shape, out_dtype, out_sharding = call_shape_dtype_sharding_rule(
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/utils.py", line 105, in call_shape_dtype_sharding_rule
    out_shardings = call_sharding_rule(
                    ^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/utils.py", line 94, in call_sharding_rule
    out_sharding = sh_rule(*avals, **kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/slicing.py", line 1418, in _slice_sharding_rule
    return _get_sharding_for_varying_out_shape(out_shape, operand, 'slicing')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/user/ml-scratch/.venv/lib/python3.12/site-packages/jax/_src/lax/slicing.py", line 1398, in _get_sharding_for_varying_out_shape
    raise core.ShardingTypeError(
jax._src.core.ShardingTypeError: slicing on sharded dims where out dim (31) is not divisible by mesh axes (4) with spec (tp) is not implemented.

I suspect it's because main/treescope/_internal/arrayviz_impl.py#L432 does not appear to account for sharding constraints like this.

Thanks.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions