haliax 1.4.dev445__tar.gz → 1.4.dev446__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. {haliax-1.4.dev445 → haliax-1.4.dev446}/PKG-INFO +1 -1
  2. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/__about__.py +1 -1
  3. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/scan.py +33 -0
  4. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_scan.py +59 -0
  5. {haliax-1.4.dev445 → haliax-1.4.dev446}/.agents/projects/api_parity.md +0 -0
  6. {haliax-1.4.dev445 → haliax-1.4.dev446}/.coveragerc +0 -0
  7. {haliax-1.4.dev445 → haliax-1.4.dev446}/.flake8 +0 -0
  8. {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/publish_dev.yaml +0 -0
  9. {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_pre_commit.yaml +0 -0
  10. {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
  11. {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_tests.yaml +0 -0
  12. {haliax-1.4.dev445 → haliax-1.4.dev446}/.gitignore +0 -0
  13. {haliax-1.4.dev445 → haliax-1.4.dev446}/.playbooks/add-types.md +0 -0
  14. {haliax-1.4.dev445 → haliax-1.4.dev446}/.playbooks/wrap-non-named.md +0 -0
  15. {haliax-1.4.dev445 → haliax-1.4.dev446}/.pre-commit-config.yaml +0 -0
  16. {haliax-1.4.dev445 → haliax-1.4.dev446}/.readthedocs.yaml +0 -0
  17. {haliax-1.4.dev445 → haliax-1.4.dev446}/AGENTS.md +0 -0
  18. {haliax-1.4.dev445 → haliax-1.4.dev446}/AUTHORS.md +0 -0
  19. {haliax-1.4.dev445 → haliax-1.4.dev446}/CONTRIBUTING.md +0 -0
  20. {haliax-1.4.dev445 → haliax-1.4.dev446}/CONTRIBUTORS.md +0 -0
  21. {haliax-1.4.dev445 → haliax-1.4.dev446}/LICENSE +0 -0
  22. {haliax-1.4.dev445 → haliax-1.4.dev446}/README.md +0 -0
  23. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/api.md +0 -0
  24. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/broadcasting.md +0 -0
  25. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/cheatsheet.md +0 -0
  26. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/css/material.css +0 -0
  27. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/css/mkdocstrings.css +0 -0
  28. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/faq.md +0 -0
  29. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/data_parallel_mesh.png +0 -0
  30. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/data_parallel_mesh_replicated.png +0 -0
  31. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_1d.png +0 -0
  32. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_1d_zero.png +0 -0
  33. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d.png +0 -0
  34. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
  35. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
  36. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
  37. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
  38. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_zero.png +0 -0
  39. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/fp8.md +0 -0
  40. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/index.md +0 -0
  41. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/indexing.md +0 -0
  42. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/matmul.md +0 -0
  43. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/nn.md +0 -0
  44. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/partitioning.md +0 -0
  45. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/primer.md +0 -0
  46. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/rearrange.ipynb +0 -0
  47. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/rearrange.md +0 -0
  48. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/requirements.txt +0 -0
  49. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/scan.md +0 -0
  50. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/state-dict.md +0 -0
  51. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/tutorial.md +0 -0
  52. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/typing.md +0 -0
  53. {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/vmap.md +0 -0
  54. {haliax-1.4.dev445 → haliax-1.4.dev446}/etc/license_header.txt +0 -0
  55. {haliax-1.4.dev445 → haliax-1.4.dev446}/mkdocs.yml +0 -0
  56. {haliax-1.4.dev445 → haliax-1.4.dev446}/pyproject.toml +0 -0
  57. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/__init__.py +0 -0
  58. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/__init__.py +0 -0
  59. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/compile_utils.py +0 -0
  60. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/dot.py +0 -0
  61. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/einsum.py +0 -0
  62. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/fp8.py +0 -0
  63. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/parsing.py +0 -0
  64. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/rearrange.py +0 -0
  65. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/scan.py +0 -0
  66. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/state_dict.py +0 -0
  67. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/util.py +0 -0
  68. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/axis.py +0 -0
  69. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/core.py +0 -0
  70. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/debug.py +0 -0
  71. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/fft.py +0 -0
  72. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/field.py +0 -0
  73. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/haxtyping.py +0 -0
  74. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/hof.py +0 -0
  75. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/jax_utils.py +0 -0
  76. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/__init__.py +0 -0
  77. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/activations.py +0 -0
  78. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/attention.py +0 -0
  79. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/conv.py +0 -0
  80. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/dropout.py +0 -0
  81. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/embedding.py +0 -0
  82. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/linear.py +0 -0
  83. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/loss.py +0 -0
  84. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/mlp.py +0 -0
  85. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/mup.py +0 -0
  86. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/normalization.py +0 -0
  87. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/pool.py +0 -0
  88. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/ops.py +0 -0
  89. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/partitioning.py +0 -0
  90. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/poly.py +0 -0
  91. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/quantization.py +0 -0
  92. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/random.py +0 -0
  93. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/specialized_fns.py +0 -0
  94. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/state_dict.py +0 -0
  95. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/tree.py +0 -0
  96. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/tree_util.py +0 -0
  97. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/types.py +0 -0
  98. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/util.py +0 -0
  99. {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/wrap.py +0 -0
  100. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/core_test.py +0 -0
  101. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_attention.py +0 -0
  102. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_axis.py +0 -0
  103. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_bitwise_ops.py +0 -0
  104. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_conv.py +0 -0
  105. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_debug.py +0 -0
  106. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_dot.py +0 -0
  107. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_dtype_typing.py +0 -0
  108. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_einsum.py +0 -0
  109. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_fft.py +0 -0
  110. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_field.py +0 -0
  111. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_fp8.py +0 -0
  112. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_hof.py +0 -0
  113. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_int8.py +0 -0
  114. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_moe_linear.py +0 -0
  115. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_coordinate_check.py +0 -0
  116. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_embedding.py +0 -0
  117. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_linear.py +0 -0
  118. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_namedarray_typing.py +0 -0
  119. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_nan_reductions.py +0 -0
  120. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_nn.py +0 -0
  121. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_ops.py +0 -0
  122. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_parsing.py +0 -0
  123. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_partitioning.py +0 -0
  124. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_poly_ops.py +0 -0
  125. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_pool.py +0 -0
  126. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_random.py +0 -0
  127. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_rearrange.py +0 -0
  128. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_scatter_gather.py +0 -0
  129. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_specialized_fns.py +0 -0
  130. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_state_dict.py +0 -0
  131. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_tree_util.py +0 -0
  132. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_utils.py +0 -0
  133. {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_visualize_sharding.py +0 -0
  134. {haliax-1.4.dev445 → haliax-1.4.dev446}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haliax
3
- Version: 1.4.dev445
3
+ Version: 1.4.dev446
4
4
  Summary: Named Tensors for Legible Deep Learning in JAX
5
5
  Project-URL: Homepage, https://github.com/stanford-crfm/haliax
6
6
  Project-URL: Bug Tracker, https://github.com/stanford-crfm/haliax/issues/
@@ -3,4 +3,4 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
 
6
- __version__ = "1.4.dev445"
6
+ __version__ = "1.4.dev446"
@@ -150,6 +150,11 @@ class BlockFoldable(Protocol[M]):
150
150
  """
151
151
  ...
152
152
 
153
+ def get_layer(self, index: int) -> M:
154
+ """Return the ``index``th layer of the folded module."""
155
+
156
+ ...
157
+
153
158
 
154
159
  class BlockSeq(ModuleWithStateDictSerialization, Generic[M]):
155
160
  """
@@ -377,6 +382,11 @@ class BlockSeq(ModuleWithStateDictSerialization, Generic[M]):
377
382
 
378
383
  return state_dict
379
384
 
385
+ def get_layer(self, index: int) -> M:
386
+ """Return the ``index``th block in this sequential container."""
387
+
388
+ return self.blocks[index]
389
+
380
390
  @property
381
391
  def _output_ckpt_name(self):
382
392
  return f"BlockSeq[{self.Block}, {self.blocks[0].__class__.__name__}].outputs"
@@ -442,6 +452,12 @@ class Stacked(ModuleWithStateDictSerialization, Generic[M]):
442
452
  Block: Axis = eqx.field(static=True)
443
453
  gradient_checkpointing: ScanCheckpointPolicy = eqx.field(static=True)
444
454
 
455
+ @property
456
+ def Layers(self) -> Axis:
457
+ """Alias for :attr:`Block` used by some downstream code."""
458
+
459
+ return self.Block
460
+
445
461
  @classmethod
446
462
  def init(
447
463
  cls,
@@ -700,6 +716,23 @@ class Stacked(ModuleWithStateDictSerialization, Generic[M]):
700
716
  unstacked_leaves = tuple(zip(*unstacked_leaves))
701
717
  return tuple(map(lambda x: jax.tree_util.tree_unflatten(structure, x), unstacked_leaves))
702
718
 
719
+ def get_layer(self, index: int) -> M:
720
+ """Return the ``index``th layer of this stacked module."""
721
+
722
+ def select_leaf(leaf):
723
+ if isinstance(leaf, haliax.NamedArray):
724
+ if haliax.selects_axis(leaf.axes, self.Block):
725
+ return leaf[self.Block, index]
726
+ else:
727
+ return leaf
728
+ if is_jax_or_hax_array_like(leaf):
729
+ if getattr(leaf, "shape", ()) and leaf.shape[0] == self.Block.size:
730
+ return leaf[index]
731
+ return leaf
732
+ return leaf
733
+
734
+ return haliax.tree_util.tree_map(select_leaf, self.stacked)
735
+
703
736
  def to_state_dict(self, prefix: str | None = None) -> StateDict:
704
737
  # this method needs to "devectorize" the blocks, so that we have a list of blocks h.0.FOO, h.1.FOO, etc.
705
738
  # first just do the normal thing with our own dict, which we'll post-process
@@ -51,6 +51,65 @@ def test_unstacked():
51
51
  assert hax.all(module.array == m.stacked.array[i])
52
52
 
53
53
 
54
+ def test_get_layer_stacked():
55
+ class Module(eqx.Module):
56
+ named: hax.NamedArray
57
+ array: jax.Array
58
+ static: int = eqx.static_field()
59
+
60
+ def __call__(self, x, *, key): # pragma: no cover - unused in this test
61
+ return x + self.array + self.static
62
+
63
+ @staticmethod
64
+ def init(named, array, static):
65
+ return Module(named=named, array=array, static=static)
66
+
67
+ Block = hax.Axis("block", 3)
68
+ E = hax.Axis("E", 4)
69
+
70
+ initial_named = hax.random.uniform(jax.random.PRNGKey(0), (Block, E))
71
+ arrays = jax.numpy.arange(Block.size)
72
+
73
+ stacked = Stacked.init(Block, Module)(named=initial_named, array=arrays, static=2)
74
+
75
+ layer = stacked.get_layer(1)
76
+
77
+ assert isinstance(layer, Module)
78
+ assert layer.static == 2
79
+ assert layer.named.axes == (E,)
80
+ assert hax.all(layer.named == initial_named["block", 1])
81
+ assert hax.all(layer.array == arrays[1])
82
+
83
+
84
+ def test_get_layer_blockseq():
85
+ class Module(eqx.Module):
86
+ named: hax.NamedArray
87
+ array: jax.Array
88
+ static: int = eqx.static_field()
89
+
90
+ def __call__(self, x, *, key): # pragma: no cover - unused in this test
91
+ return x + self.array + self.static
92
+
93
+ @staticmethod
94
+ def init(named, array, static):
95
+ return Module(named=named, array=array, static=static)
96
+
97
+ Block = hax.Axis("block", 3)
98
+ E = hax.Axis("E", 4)
99
+
100
+ initial_named = hax.random.uniform(jax.random.PRNGKey(0), (Block, E))
101
+ arrays = jax.numpy.arange(Block.size)
102
+
103
+ seq = BlockSeq.init(Block, Module)(named=initial_named, array=arrays, static=2)
104
+
105
+ layer = seq.get_layer(2)
106
+
107
+ assert isinstance(layer, Module)
108
+ assert layer.static == 2
109
+ assert hax.all(layer.named == initial_named["block", 2])
110
+ assert hax.all(layer.array == arrays[2])
111
+
112
+
54
113
  def test_vmap():
55
114
  class Module(eqx.Module):
56
115
  weight: hax.NamedArray
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes