459 Commits

Author SHA1 Message Date
Lena Martens
cb6a3f216f Leak checker: garbage collect before collecting hanging references. 2021-11-30 14:02:51 +00:00
jax authors
f196f3780a Merge pull request #8667 from mattjj:custom-pp-eqn-rules
PiperOrigin-RevId: 412140658
2021-11-24 15:01:24 -08:00
Matthew Johnson
3d16a32986 add option for enabling custom jaxpr pprint rules 2021-11-24 14:31:58 -08:00
Peter Hawkins
4e21922055 Use imports relative to the jax package consistently, rather than .-relative imports.
This is more consistent, since currently we use a mix of both styles. It may also help pytype yield more accurate types.

PiperOrigin-RevId: 412057514
2021-11-24 07:48:29 -08:00
Peter Hawkins
839d410de0 [MLIR] Move most MLIR translation rules into lax.
PiperOrigin-RevId: 411942327
2021-11-23 18:58:28 -08:00
Matthew Johnson
8430deda3e custom pp_eqn rules, simpler xla_call print 2021-11-23 15:52:52 -08:00
Jake VanderPlas
496e400c71 [x64] Make autodiff respect weak types 2021-11-23 15:04:08 -08:00
Peter Hawkins
d262bae88b Split jax.interpreters.xla up into three pieces:
* jax._src.device_array, which contains the definition of DeviceArray.
* jax.interpreters.xla, which contains code for lowering jaxprs into XLA computations.
* jax._src.dispatch, which contains code for executing primitives and jit-compiled functions (xla_call_p's impl logic).

The purpose of splitting up this file is that I would like to treat jax.interpreters.mlir lowering as an alternative to jax.interpreters.xla, but we wish to share the device_array and computation dispatch pieces. Currently jax.interpreters.mlir duplicates most of the dispatch logic. (That refactoring is for a future change; this change just moves the existing code around.)

PiperOrigin-RevId: 411565432
2021-11-22 08:22:43 -08:00
jax authors
f08a5a07a8 Merge pull request #8552 from mattjj:elide-more-convert-element-types
PiperOrigin-RevId: 411082070
2021-11-19 09:44:30 -08:00
Matthew Johnson
abbf78b5c3 generalize jaxpr simplification machinery
also:
* fix jit invariance bug around weak types
* elide trivial broadcasts

This started as an attempt to simplify some jaxpr pretty-prints, by (1)
eliding some convert_element_type applications that I thought were
unnecessary and (2) eliding some trivial broadcasts.

But it turned out that we were actually pruning more
convert_element_types than we should! In particular, see
test_weak_type_jit_invariance; that test fails on the main branch even
if we add the fixes in DynamicJaxprTrace.new_const, because [this
logic](b53a174042/jax/interpreters/partial_eval.py (L1225))
was not paying attention to weak types and hence clobbered them.

In addition to fixing those bugs that turned up (the changes in
DynamicJaxprTrace, and in what is now _convert_elt_type_fwd_rule), this
PR generalizes the jaxpr simplification machinery so as not to be a
couple special cases on convert_element_type_p. Insetad, we have tables
of rules! How we love them.

These rule signatures should let us add simplifications like forwarding
variables through calls and other higher-order primitives. That's all
future work though.
2021-11-19 09:00:59 -08:00
George Necula
3715fcb930 Added workaround for bug in XLA 2021-11-18 11:01:50 +02:00
George Necula
75155f5eda [shape_poly] Refactor arange and image_resize for shape polymorphism
Bug: 8367

Small refactoring to jax.image.resize to make it compatible with
shape polymorphismin jax2tf. In the process added also support for
jnp.arange([dim_poly]). Note that the underlying lax.iota already
supported shape polymorphism.
2021-11-18 10:27:32 +02:00
Jake VanderPlas
b472ac3c46 jax_check_tracer_leaks: add warning about debuggers 2021-11-08 09:21:18 -08:00
Sharad Vikram
32319e1bc3 Fix forward for PR #8392 (made source_info for new_jaxpr_eqn argument optional again)
PiperOrigin-RevId: 406466709
2021-10-29 15:50:14 -07:00
jax authors
2ab00151ed Copybara import of the project:
--
b40245e38d7837a7777735ad60f3b5b1ac2d499d by Sharad Vikram <sharad.vikram@gmail.com>:

Use `SourceInfo` named tuple to keep track of source information

PiperOrigin-RevId: 406293469
2021-10-28 23:07:56 -07:00
Sharad Vikram
b40245e38d Use SourceInfo named tuple to keep track of source information 2021-10-28 13:31:26 -07:00
Peter Hawkins
48bbdbc890 Change jax.core.DropVar to be a non-singleton.
Previously jax.core.DropVar was a singleton value (jax.core.dropvar) whose type was always jax.core.AbstractUnit. However, this type is misleading: a DropVar is an equation output, and typically we would expect it to have an array type. In particular, the unit type confuses new-style translation rules that expect to use the output aval on an equation as part of the lowering logic.

Instead, change DropVar to be a non-singleton subclass of Var instead with a flexible choice of aval.

PiperOrigin-RevId: 404071001
2021-10-18 15:02:54 -07:00
Peter Hawkins
6a45a9236d Remove the _num_buffers attribute from core.AbstractValue.
The number of buffers used to represent an abstract value is a property specific to a particular representation of that abstract value. Currently the only representation is an XLA representation, but that may change in the future. Instead, callers who want to know how XLA would represent an aval should ask the XLA module instead. In this case, we call len(xla.aval_to_xla_shapes(...)) instead.
2021-10-13 14:35:07 -04:00
Roy Frostig
9a182e66c8 order-independent hash in core.NamedShape 2021-10-12 15:53:44 -07:00
Matthew Johnson
482e41d796 remove ShapedArray.__len__
It was confusing to overload, since we sometimes think of avals like
shapes paired with dtypes, and in that case len(aval) should perhaps be
like len(aval.shape). The only place where this behavior was relied on
was sparse/ops.py.
2021-10-07 22:04:16 -07:00
Peter Hawkins
42e0d4e5f5 Remove jax._src.util.partialmethod.
Use functools.partialmethod instead, which has existed since Python 3.4. The JAX partialmethod doesn't work correctly in Python 3.10.

Issue #8097
2021-10-05 12:12:41 -04:00
Peter Hawkins
256e7220ff [JAX] Fix pylint errors.
* trailing-whitespace
* dangerous-default-value. None of these appear to be bugs in practice, but the potential for accidentally mutating the default value is there, and the cost of avoiding the problem is small.
* invalid-envvar-default. Pass strings as getenv() defaults.
* unnecessary-semicolon. Use tuples instead for this one-liner.
* invalid-hash-returned. Raise an exception rather than asserting false.
* pointless-string-statement. Use comments instead.
* unreachable. Use @unittest.skip() decorator rather than raising as first line in test.
* logging-not-lazy. Make the logging lazy.
* bad-format-string-type. Use f-string instead.
* subprocess-run-check. Pass check=...

PiperOrigin-RevId: 400858477
2021-10-04 17:54:46 -07:00
Peter Hawkins
d4023508a4 Uniquify variable names globally within a jaxpr.
It is confusing when the same name is shadowed within an inner lambda expression. Use globally unique variable names in each pretty-printed jaxpr.
2021-10-01 12:49:47 -04:00
Peter Hawkins
ef560fb177 Print long variable lists more compactly. 2021-09-28 10:01:51 -04:00
Peter Hawkins
5fa4613e99 Adds a Wadler-Lindig pretty printer.
Changes jaxpr printing to use it.
2021-09-27 21:09:24 -04:00
Peter Hawkins
8b2123968a Switch internal users of jax.util.partial to use functools.partial. 2021-09-13 21:09:58 -04:00
Adam Paszke
c845d15b3a Cache used_axis_names calls for jaxprs
All control-flow primitives are `AxisPrimitive`s now, which means that we're doing
lots of those used-names traversals during dispatch and they can be expensive!
This adds caching to try to lower the cost of that change.

PiperOrigin-RevId: 395921887
2021-09-10 07:10:07 -07:00
Sharad Vikram
cc3e197991 Combine initial_style_batchers with collective_rules 2021-09-09 11:23:51 -07:00
Adam Paszke
1158530faa Remove axis name from named_shape when unmapping avals
Even though `vmap` and `pmap` don't use avals with names, the batching infrastructure
is used to implement xmap and pjit. So while we keep the introduction of names carefully
scoped, forgetting to remove them at the right points leads to extremely confusing errors.

PiperOrigin-RevId: 395423006
2021-09-08 01:42:15 -07:00
Adam Paszke
0636f490f3 Ensure that named axes consistently refer to global axis sizes in xmap
Fixes #6959.

PiperOrigin-RevId: 395210686
2021-09-07 03:26:21 -07:00
jax authors
cc1cc98d82 Merge pull request #7783 from shoyer:set-item-errors
PiperOrigin-RevId: 394442094
2021-09-02 06:02:56 -07:00
Stephan Hoyer
d204325c1f Don't refer to deprecated jax.ops.index_update in error messages
I've also updated the docs for ``jax.ops`` to note that ``at[].set()``
is guaranteed to be performed in-place under JIT. Someone who knows XLA
well should double check that fact!
2021-09-01 20:43:13 -07:00
Matthew Johnson
8ae1245c21 add assertions 2021-08-30 11:10:10 -07:00
Matthew Johnson
83f95a5dae custom_jvp/vjp tweaks and fixes 2021-08-17 17:51:35 -07:00
Markus Kunesch
6708cd3158 Add dtype to string representation of ConcreteArray.
The string representation of ConcreteArray did not include the data type of the
wrapped value. This makes it harder to spot the reason for errors arising from
inconsistent values (issue #5364). This commit adds the data type to the string
representation of ConcreteArray.
2021-08-13 15:01:26 +00:00
jax authors
17a606a95d Merge pull request #7556 from LenaMartens:main
PiperOrigin-RevId: 389876971
2021-08-10 07:20:35 -07:00
lenamartens
ddaef095bb Reword UnexpectedTracerError and add visual dividers. 2021-08-10 14:31:40 +01:00
Peter Hawkins
a3a2ed6206 Strip debug_info and jaxpr_stack from MainTrace instances used as C++ JIT cache keys.
Without this fix, we created reference count cycles via the C++ JIT cache.
2021-08-09 16:05:02 -04:00
Jake VanderPlas
63a788b4de Cleanup: switch to new version of super() 2021-08-05 13:11:07 -07:00
George Necula
0c1a37ce33 [jax2tf] Add shape polymorphism support for jnp.eye 2021-08-03 09:19:49 +03:00
botev
69fcc0c20d Abstracts into a separate function to evaluation of a single jaxpr equation. 2021-08-01 18:39:51 +01:00
Matthew Johnson
c31688d2d1 fix cond-of-pmap bug 2021-07-29 10:34:43 -07:00
Lena Martens
2190734637 Add tracers to LeakChecker error, and filter out false positives this way.
If we can't find any hanging tracers in the gc.get_referrers chain, is it
really a leak? Probably not!
2021-07-29 15:45:24 +01:00
Lena Martens
19ee7b22e1 Expose UnexpectedTracerError and add docs. 2021-07-27 23:23:28 +01:00
George Necula
b62ceba91c [jax2tf] Expand shape polymorphism support to use dimension polynomials as values.
The goal of this change is to support shape polymorphism for operations
such as average (which needs to divide by the size of a dimension) or
indexing (which needs to normalize indices by comparing them with 0 and
adding dimension size for negative indices). In both of these cases
the size of a dimenion needs to be used as a value in the array
computation. In general, the size of a dimension is used only to
customize primitives.

This change introduces `core.dim_as_value` which must be used on
a dimension size before using it as a value in the array computation.
E.g.,

```
def average(x):
   return jnp.sum(x, axis=0) / core.dim_as_value(x.shape[0])
```

This function is the identity function if the dimension size is
constant, otherwise it uses a new primitive `shape_poly.dim_as_value_p`.

Note that this does not change fundamentally the flavor of shape
polymorphism supported in jax2tf: intermediate shapes and their values
may depend on the input shapes, but never does a shape depend on the
input values. In fact, one could have expressed the `dim_as_value`
already:

```
def dim_as_value(d):
   jnp.sum(jnp.broadcast_to(jnp.array(1), shape=(d,)))
```

We were able to suppot `jnp.mean`, `jnp.average`, `jnp.take`,
`lax.dynamic_slice`, `lax.dynamic_update_slice` by using
`core.dim_as_value` internally, but to fully roll-up the solution
we need to make `core.dim_as_value` a public API and teach the
users how to use it when they want to use shape polymorphism.
Alternatively, perhaps there is a way to automatically convert
dimension polynomials to values when passed to the lax primitives.
2021-07-27 09:02:15 +03:00
Roy Frostig
258ae44303 refine constant-hoisting heuristic for closure_convert
Instead of hoisting all float-type arrays during closure conversion,
only hoist JVPTracers (or tracers carrying such tracers
indirectly). Doing so better approximates the subset of
closure-captured values that participate in AD.

Co-authored-by: Matthew Johnson <mattjj@google.com>
2021-07-26 18:50:45 -07:00
Lena Martens
24c9a933d6 Add shape and dtype of leaked tracer to UnexpectedTracerError. 2021-07-21 17:50:44 +01:00
Adam Paszke
d25f4b34b8 Add an option to strictly enforce sharding implies by named axes
At the moment, xmap SPMD lowering only enforces sharding constraints for
computation inputs and outputs, while leaving sharding propagation in the
body entirely up to the XLA SPMD partitioner. This patch adds a new flag
`experimental_xmap_enforce_inferred_sharding` that inserts additional
sharding constraint between every JAX primitive in the xmapped function.
Assuming that the SPMD partitioner never overrides user-defined constraints,
this should restrict it sufficiently to generate a computation that is
partitioned exactly as implied by the evolution of intermediate named shapes.

PiperOrigin-RevId: 385562158
2021-07-19 08:39:27 -07:00
George Necula
7e335e0e2e [jax2tf] Fix conversion of gradients for shape polymorphic functions.
This fixes the case when the primal shape polymorphic function has
output shapes that are polynomials of the input shapes (not just
dimension variables).
2021-06-23 11:20:11 +02:00
Qiao Zhang
57234e7eaa Fix typos and indent. 2021-06-16 11:10:42 -07:00